2010-01-28 26 views
5

Tôi đang chạy Windows và tôi đang cố gắng tham khảo một thư mục. chức năng của tôi bắt đầu ra như thế này:Làm thế nào để tôi tham khảo một thư mục trong Java?

File file = new File("C:\\somedir\\report"); 
if (!file.exists()) { 
    file.mkdirs(); 
} 
doStuffWith(file); 

tôi nhận được một NullPointerException trong doStuffWith chức năng, khi tôi cố gắng gọi listFiles. Tôi đã xem C: \ somedir và tôi đã tìm thấy gì - có một tệp gọi là "báo cáo" không có phần mở rộng, và cũng có một thư mục có tên là "báo cáo"! Điều dường như xảy ra là đối tượng file đang đề cập đến báo cáo tệp thay vì thư mục . Làm cách nào để đảm bảo rằng tôi đang đề cập đến thư mục chứ không phải tệp?

+2

Bạn đã thử tệp File = new File ("C: \\ somedir \\ report \\"); (lưu ý dấu gạch chéo). Không có ý tưởng nếu điều đó hoạt động nhưng giá trị một xây dựng nhanh chóng và thử nghiệm. – Paolo

+2

Loại hệ điều hành nào cho phép điều này? Tôi đã ấn tượng rằng Windows không cho phép điều này. Có thể là thư mục của bạn có một số ký tự vô hình trong tên (một không gian, ví dụ)? –

+0

Tôi chỉ cố gắng tạo một thư mục có tên là "Thư mục" và một tệp mở rộng có tên "Thư mục" và các cửa sổ đã phàn nàn về nó. Tôi đang chạy Windows XP SP3 32-bit. –

Trả lời

3

một cách để tiếp tục là chuyển đối tượng tệp tương ứng với "C: \ somedir" sang phương thức và bên trong phương thức, thực hiện listFiles() và duyệt qua nội dung, mỗi lần kiểm tra tên tệp và nó là "báo cáo", làm một isDirectory(). tiến hành xử lý thực tế khi điều này trả về đúng sự thật.

+0

Vâng đó chắc chắn là một giải pháp cho vấn đề của tôi. Nhưng khá kém hiệu quả, có ai biết gì tốt hơn không? – Kidburla

+0

@Kidburla: điều này có thực sự hoạt động không? Nếu có, thì bạn có thể nhìn vào hai đối tượng File và thấy sự khác biệt (trong trường hợp xấu nhất bạn có thể muốn xem xét với sự phản chiếu). –

+0

@Kiburla Tôi biết nó không phải là cách tiếp cận tốt nhất ... điều này chỉ xảy ra là điều đầu tiên xảy ra với tôi khi tôi nhìn vào vấn đề .. và nghĩ rằng nó xứng đáng chia sẻ :-) – Aadith

3

tôi nghĩ rằng đó là một phương pháp isDirectory() sẽ cho bạn biết nếu nó là một thư mục

--edit

đó là những gì tôi nhận được cho là dậy sớm như vậy. Tôi chạy mã của bạn tại địa phương và nó hoạt động tốt cho tôi. Đã có thể tạo tệp mới, đọc nội dung thư mục, v.v. Bạn đang cố gắng làm gì khác?

+1

Vâng, điều đó hiển nhiên ... Nhưng làm thế nào bạn có thể có được một xử lý của ** thư mục thực tế **? Đó là toàn bộ vấn đề ở đây. – BalusC

+0

Tôi đồng ý với BalusC ở trên, điều này không trả lời câu hỏi của tôi, xin lỗi ... – Kidburla

+0

Một lần nữa tôi sợ bạn đã hiểu sai câu hỏi của tôi. Mã này sẽ làm việc trong hầu hết các trường hợp, nhưng tôi đã quan tâm đến trường hợp cụ thể, nơi có một tệp mở rộng được gọi là "báo cáo" trong thư mục "somedir". – Kidburla

1

Tôi không hiểu vấn đề này làm việc tốt cho tôi:

public class MkDir { 
    static void doStuff(File dir) { 
     if (dir.isDirectory()) { 
      File[] listFiles = dir.listFiles(); 
      for (File f : listFiles) { 
       System.out.println(f.getName()); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     File file = new File("C:\\dev\\rep2\\rep"); 
     if (!file.exists()) { 
      file.mkdirs(); 
     } 
     doStuff(file); 
    } 
} 
+0

Tôi e rằng bạn đã hiểu sai câu hỏi của mình. Mã này sẽ làm việc trong hầu hết các trường hợp, nhưng tôi đã quan tâm đến trường hợp cụ thể, nơi có một tệp mở rộng được gọi là "báo cáo" trong thư mục "somedir". – Kidburla

0

Kiểm tra xem hệ thống tập tin của bạn đã có độ nhạy trường hợp kích hoạt

Nếu vậy, bạn có thể (HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\ dword:ObCaseInsensitive trong registry.) bị một vấn đề liên quan đến vụ kiện cắn. Một cách để kiểm tra:

String someName = "./nameNotUsedYet"; 
boolean first = new File(someName).mkdirs(); 
boolean second = new File(someName.toUpperCase()).mkdirs(); 
System.out.println("first = " + first + ", second = " + second); 

Nếu cả hai mkdirs() cuộc gọi thành công, bạn biết bạn có một trường hợp liên quan đến biến chứng. Nếu đúng như vậy, hãy đảm bảo rằng bạn nhận được trường hợp cho số "C:\somedir\report" chính xác.

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