2010-06-05 38 views
7

Khi tôi vượt qua File file đến một phương pháp tôi đang cố gắng để có được đường dẫn đầy đủ của nó như file.getAbsolutePath(); Tôi luôn nhận được kết quả tương tự cho dù tôi sử dụng đường dẫn tuyệt đối hoặc kinh điển PATH_TO_MY_WORKSPACE/projectName/filename và nó không có , làm cách nào để có được vị trí chính xác của tệp?Nhận đường dẫn tệp đầy đủ trong java

Cảm ơn bạn

CHI TIẾT:

Dưới đây là một số mã và giải pháp này (xấu của nó, nhưng làm việc của nó):

private static void doSomethingToDirectory(File factDir) throws IOException { 
      File[] dirContents = factDir.listFiles(); 

      if(factDir.isDirectory() && dirContents.length > 0){ 
       for (int i = 0; i < dirContents.length; i++) { 
        for (String str : dirContents[i].list()) { 
         if(str.equals(TEMP_COMPARE_FILE)){ 
          process(new File(dirContents[i].getAbsolutePath() + "\\" + str)); 
         } 
        } 
       }   
      } 
     } 

Tôi lặp thư mục máng nơi factDir là src/main , Tôi đang tìm kiếm các tập tinBeProcessed.txt chỉ có giá trị TEMP_COMPARE_FILE và tôi đang gửi chúng để xử lý phương pháp mà đọc các tập tin và xử lý nó.

Nếu ai đó có thể tốt hơn giải pháp tôi sẽ biết ơn

+1

bạn có chắc nó không có ở đó? bạn có làm mới cây tập tin không? (nếu sử dụng nhật thực;)) – RoflcoptrException

+0

Bạn đã tạo đối tượng tệp như thế nào? –

+0

@Sebi chắc chắn tôi đã làm, @Peter có tôi đã làm :) – ant

Trả lời

13

quote này từ Javadoc có thể hữu ích:

Một tên đường dẫn, cho dù trừu tượng hoặc ở dạng chuỗi, có thể là tuyệt đối hoặc tương đối. Một tên đường dẫn tuyệt đối được hoàn thành trong đó không có thông tin khác là cần thiết để xác định vị trí tệp mà nó biểu thị. Ngược lại, một tên đường dẫn tương đối phải được diễn giải dưới dạng thông tin được lấy từ một số tên đường dẫn khác. Theo mặc định, các lớp trong gói java.io luôn giải quyết tên đường dẫn tương đối so với thư mục người dùng hiện tại. Thư mục này được đặt tên bởi thuộc tính hệ thống user.dir và thường là thư mục trong đó máy ảo Java được gọi.

tôi giải thích điều này vì vậy nếu bạn tạo đối tượng File của bạn với new File("filename") nơi filename là một đường dẫn tương đối, con đường đó sẽ không được chuyển đổi thành một đường dẫn tuyệt đối ngay cả bởi một cuộc gọi đến file.getAbsolutePath().

Cập nhật: bây giờ mà bạn gửi mã, tôi có thể nghĩ ra vài cách để cải thiện nó:

  • bạn có thể sử dụng một FilenameFilter để tìm các tập tin mong muốn,
  • lưu ý rằng listlistFiles trở lại null cho các đối tượng không phải thư mục, vì vậy chúng tôi cần kiểm tra thêm cho điều đó,
  • bạn cũng có thể sử dụng lại listFiles() trong vòng lặp bên trong, do đó tránh cần phải tạo các đối tượng File mới con đường lắp ráp tay thứ i. (Btw lưu ý rằng phụ thêm \\ theo cách thủ công vào đường dẫn không được di chuyển; cách thích hợp sẽ là sử dụng File.separator).

Kết quả cuối cùng là

private static void doSomethingToDirectory(File factDir) throws IOException { 
    if (factDir.isDirectory()) { 
    for (File file : factDir.listFiles()) { 
     if (file.isDirectory()) { 
     for (File child : file.listFiles(new MyFilter())) { 
      process(child); 
     } 
     } 
    }   
    } 
} 

class MyFilter implements FilenameFilter { 
    public boolean accept(File dir, String name) { 
    return name.equals(TEMP_COMPARE_FILE); 
    } 
} 

Lưu ý rằng mã này bắt chước hành vi của mảnh ban đầu của bạn mã nhiều như tôi hiểu nó; đáng chú ý nhất, nó chỉ tìm thấy các tệp có tên riêng trong các thư mục con trực tiếp của factDir, không phản hồi.

+2

w0w Peter Tôi chắc chắn phải nói điều này, tôi nghĩ đây là một trong những câu trả lời hay nhất mà tôi từng nhận được trên SO, đề nghị lớp MyFilter giảm như rất nhiều mã, chỉ AMAZING. Cảm ơn nhiều – ant

2

Tôi nghĩ rằng có một cách nó có thể giúp bạn nếu và chỉ khi tệp nằm trong thư mục chương trình.

đầu tiên bạn nhận được thư mục chương trình bằng cách:

new File(".").getCanonicalPath() 

thì:

nếu file là bên trong một thư mục cụ thể như folder\\filename đường dẫn đầy đủ sẽ

(new File(".").getCanonicalPath() + "\\folder\\filename") 

hoặc nếu file nằm ngay trong thư mục chương trình: toàn bộ đường dẫn wi sẽ có

(new File(".").getCanonicalPath() + "\\filename") 

tôi muốn câu trả lời điều này giúp bạn :)

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