2011-11-03 25 views
6

Code:Có cách nào thích hợp để kiểm tra sự tồn tại của tệp/thư mục trong Java không?

String dir = //Path to the directory 
File saveDir = new File(dir); 
//Here comes the existence check 
if(!saveDir.exists()) 
    saveDir.mkdirs(); 

phần mã này được sử dụng để lưu các tập tin với một đường dẫn thư mục cho hệ thống tập tin. Trước khi lưu, tôi muốn kiểm tra xem thư mục lưu đã tồn tại chưa. Tuy nhiên kiểm tra sự tồn tại dường như không hoạt động theo cách mà tôi muốn. Nếu không loại bỏ mệnh đề if thì các thư mục mong muốn sẽ không được tạo. Tôi đi qua câu hỏi ngăn xếp thú vị này trong khi tìm kiếm vấn đề của tôi. Alternative to File.exists() in Java. Theo tôi hiểu java.io có vấn đề này.

Có cách nào phù hợp và an toàn để kiểm tra sự tồn tại của thư mục hoặc tài nguyên trong khi thực hiện các thao tác tệp không?

+0

Hơi không liên quan, nhưng miễn là bạn đang cẩn thận về nó, bạn có lẽ nên kiểm tra 'isDirectory()' quá. – Kevin

Trả lời

6

Vâng, ngay cả khi việc kiểm tra sẽ là đúng, bạn không bao giờ có thể chắc chắn rằng thư mục vẫn còn tồn tại sau các if điều kiện đã được được đánh giá. Một quá trình hoặc người dùng khác chỉ có thể tạo/xóa nó. Vì vậy, bạn phải kiểm tra xem các hoạt động không thành công (có thể bắt ngoại lệ thích hợp) anyway.

Vì vậy, bạn không nên dựa vào kiểm tra và mong đợi trường hợp xấu nhất luôn. (Vâng, kiểm tra thể thể hữu ích cho ngăn cản bạn làm điều gì đó không cần thiết, hoặc để hỏi người sử dụng để xác nhận vv Nhưng họ không đảm bảo bất cứ điều gì.)

+0

Cảm ơn bạn đã trả lời. Phần còn lại của mã bắt đầu hoạt động lưu tệp với luồng đầu vào và đầu ra, do đó cần thiết để xử lý hoặc ném IOException. Nhưng tôi vẫn không muốn mã của tôi cố gọi phương thức tạo thư mục cho một phương thức hiện có. – fgakk

+0

@fga: tốt, nếu thư mục đột nhiên xuất hiện/biến mất, có điều gì đó không ổn xảy ra. Mã của bạn nên hoạt động chính xác và không nên ném nếu mọi thứ đều đi _well_ - nhưng bạn phải xử lý ngoại lệ cho trường hợp khi có gì đó đi _wrong_. Vì vậy, nó không quan trọng để kiểm tra xem thư mục có tồn tại hay không, vì nó sẽ hoạt động trong luồng công việc bình thường. Nhưng khi kiểm tra này là không đáng tin cậy, bạn không thể nói rằng bạn không thể nói ngoại lệ sẽ không được ném. – Vlad

27
new File(dir).getCanonicalFile().isDirectory(); 

Skeleton để bạn tham khảo: -

File f = new File("...."); 
if (!f.exists()) { 
    // The directory does not exist. 
    ... 
} else if (!f.isDirectory()) { 
    // It is not a directory (i.e. it is a file). 
    ... 
} 
+4

Một ví dụ khác về câu trả lời có nhiều phiếu bầu hữu ích hơn là câu trả lời được chấp nhận. – Amala

0

FileChannel.lock() không chỉ là những gì bạn muốn miễn là nó không phải là một thread trong JVM đó là xóa thư mục trong khi bạn đang sử dụng in Điều này đòi hỏi một khóa hệ điều hành trên một tập tin/thư mục thay mặt cho quá trình JVM, do đó, trong khi các quá trình khác sẽ không thể truy cập thư mục, chủ đề trong JVM có thể.

1

Chỉ cần thực hiện cuộc gọi đến mkdirs. Nó sẽ không ghi đè lên các thư mục hiện có để thực sự, kiểm tra của bạn là không cần thiết (và trong mọi trường hợp, không đáng tin cậy).

Các vấn đề liên quan