2009-08-13 29 views
26

Ứng dụng tiện ích nhỏ của tôi yêu cầu người dùng tạo thư mục đầu ra thông qua bộ chọn tệp GUI. Sau đó, nó tạo ra rất nhiều tệp trong thư mục đầu ra này sau khi xử lý một số.Kiểm tra quyền truy cập ghi trong thư mục trước khi tạo tệp bên trong thư mục

Tôi cần phải kiểm tra xem ứng dụng có quyền ghi để nó thông báo cho người sử dụng và không không tiếp tục với quá trình xử lý (mà có thể mất một thời gian dài)

nỗ lực đầu tiên của tôi là canWrite() phương thức java.io.File. Nhưng điều này không hoạt động vì nó tương ứng với mục nhập thư mục chứ không phải nội dung của nó. Tôi đã thấy ít nhất một phiên bản của thư mục Windows XP có thể được đổi tên hoặc xóa nhưng không thể tạo tệp trong đó (vì quyền). Đây thực sự là testcase của tôi.

cuối cùng tôi giải quyết với các giải pháp sau đây

//User places the input file in a directory and selects it from the GUI 
//All output files will be created in the directory that contains the input file 
File fileBrowse = chooser.getSelectedFile(); //chooser is a JFileChooser 
File sample = new File(fileBrowse.getParent(),"empty.txt"); 
try 
{ 
    /* 
     * Create and delete a dummy file in order to check file permissions. Maybe 
     * there is a safer way for this check. 
     */ 
     sample.createNewFile(); 
     sample.delete(); 
} 
catch(IOException e) 
{ 
     //Error message shown to user. Operation is aborted 
} 

Tuy nhiên điều này không cảm thấy tao nhã với tôi vì nó chỉ cố gắng để thực sự tạo ra một tập tin và kiểm tra xem các hoạt động thành công.

Tôi nghi ngờ rằng phải có một cách tốt hơn cho điều này nhưng tất cả các giải pháp tôi đã tìm thấy cho đến nay với Người quản lý bảo mật và nội dung xử lý với Java Applet chứ không phải ứng dụng độc lập. Tôi có thiếu gì đó không?

Cách được khuyến nghị để kiểm tra quyền truy cập tệp trong thư mục trước khi thực sự ghi tệp là gì?

Tôi đang sử dụng Java 5.

+0

Điều gì xảy ra nếu "empty.txt" đã tồn tại? Sau đó, bạn sẽ xóa một tệp có thể quan trọng. –

+0

Có thể tốt nhất nếu boolean trả về bởi createNewFile() được sử dụng để hiểu xem tệp đó có thực sự được tạo ra không. – kazanaki

Trả lời

19

Bạn có thể kiểm tra các quyền tập tin, hãy chắc chắn thư mục tồn tại, và làm rất nhiều kiểm tra hoặc tìm một thư viện mà làm tất cả mà kiểm tra cho bạn NHƯNG (!) không phải là cách tốt nhất để kiểm tra? Nếu bạn kiểm tra quyền và hệ thống tập tin thay đổi ... bạn sẽ phải thay đổi mã của bạn. Nhưng cố gắng để viết một tập tin sẽ luôn luôn cho bạn biết nếu bạn có thể viết một tập tin.

Giải pháp của bạn không phải là giải pháp thanh lịch nhất. Nó không phải là một bản vá mã hóa cứng giá rẻ hoặc một cái gì đó xấu xí. Đó chỉ là mã bình thường. Và nó sẽ luôn hoạt động. Nhưng nếu bạn không muốn thấy rằng kiểm tra trong mã chỉ cần tách nó bằng cách đặt nó trong lớp mà chỉ có mục tiêu là để kiểm tra cho có thể bằng văn bản. Trong thực tế, bạn nên đặt nó trong một lớp tiện ích wheter bạn thích sự thanh lịch hay không.

Giải pháp khác là đặt toàn bộ mã viết mã vào ổ cứng của bạn, trong khi thử. Và nếu bạn không thể viết, toàn bộ phần sẽ bị bỏ qua và bạn cung cấp phản hồi cho người dùng bằng thông báo trong phần bắt đầu.

0

nó không làm việc ngay cả nếu bạn gọi canWrite trên con đường thức?

File sample = new File(fileBrowse.getParent(),"empty.txt"); 

if (sample.canWrite()) { 
    doSomethingUseful(sample); 
} else { 
    notifyUser(); 
} 
+4

Nó không phải vì kiểm tra canWrite cũng nếu tệp tồn tại. Đây không phải là trường hợp với mã của bạn. Nó được đề cập trong javadoc. – kazanaki

0

bạn có thể sử dụng FilePermission để xem chi tiết. Tôi tìm thấy một cách mà bạn cần phải thực hiện SecurityManager mã là herehere

+0

Tôi đã xem FilePermission nhưng có vẻ như với tôi rằng nó được sử dụng trong Applet để cấp quyền truy cập vào các tệp. Bạn có ví dụ với các ứng dụng độc lập không? – kazanaki

0

Tôi muốn nói tập trung vào việc cung cấp trải nghiệm người dùng tốt nếu/khi tệp không thể được viết và chỉ cần không bận tâm kiểm tra trước đường dẫn.Vì bạn nói rằng việc xử lý mất một tome ling, không có cách nào để đảm bảo rằng bạn vẫn sẽ có thể ghi vào đường dẫn đó khi nó kết thúc. Các điều khoản có thể thay đổi rất tốt giữa khi bạn kiểm tra và khi bạn viết, hoặc đĩa có thể lấp đầy, hoặc ...

0

Sử dụng Java 1.8 Tôi đã có thể sử dụng như sau.

Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(Paths.get(destDir), LinkOption.NOFOLLOW_LINKS); 
Assert.assertTrue("User did not have read permission.", permissions.contains(PosixFilePermission.OWNER_READ)); 
Assert.assertTrue("User did not have execute permission.", permissions.contains(PosixFilePermission.OWNER_EXECUTE)); 
Assert.assertTrue("User did not have write permission.", permissions.contains(PosixFilePermission.OWNER_WRITE)); 

Assert.assertFalse("Group did have read permission.", permissions.contains(PosixFilePermission.GROUP_READ)); 
Assert.assertFalse("Group did have execute permission.", permissions.contains(PosixFilePermission.GROUP_EXECUTE)); 
Assert.assertFalse("Group did have write permission.", permissions.contains(PosixFilePermission.GROUP_WRITE)); 

Assert.assertFalse("Others did have read permission.", permissions.contains(PosixFilePermission.OTHERS_READ)); 
Assert.assertFalse("Others did have execute permission.", permissions.contains(PosixFilePermission.OTHERS_EXECUTE)); 
Assert.assertFalse("Others did have write permission.", permissions.contains(PosixFilePermission.OTHERS_WRITE)); 
Các vấn đề liên quan