2014-10-31 14 views
6

Tôi mới sử dụng gói nio của Java và tôi không thể tìm ra cách lấy tệp từ một thư mục này sang thư mục khác. Chương trình của tôi là nghĩa vụ phải đọc qua một thư mục và thư mục con của nó và xử lý các tập tin dựa trên một số điều kiện nhất định. Tôi có thể nhận được tất cả các tập tin bằng cách sử dụng Files.walkFileTree nhưng khi tôi cố gắng di chuyển chúng tôi nhận được một java.nio.file.AccessDeniedException.Tôi làm cách nào để chuyển tệp vào thư mục không trống?

Nếu tôi cố gắng sao chép chúng, tôi nhận được một DirectoryNotEmptyException. Tôi đã không thể tìm thấy bất kỳ trợ giúp nào trên Google. Tôi chắc rằng phải có một cách dễ dàng để di chuyển một tập tin từ một thư mục này sang một thư mục khác, nhưng tôi không thể hiểu được nó.

Đây là những gì tôi đang cố gắng mà được các DirectoryNotEmptyException:

private static void findMatchingPdf(Path file, ArrayList cgbaFiles) { 
    Iterator iter = cgbaFiles.iterator(); 
    String pdfOfFile = file.getFileName().toString().substring(0, file.getFileName().toString().length() - 5) + ".pdf"; 
    while (iter.hasNext()){ 
     Path cgbaFile = (Path) iter.next(); 
     if (cgbaFile.getFileName().toString().equals(pdfOfFile)) { 
      try { 
       Files.move(file, cgbaFile.getParent(), StandardCopyOption.REPLACE_EXISTING); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 
} 

Tôi lặp lại thông qua một danh sách các tập tin, cố gắng để phù hợp với một tập tin .meta với một .pdf cùng tên. Khi tôi tìm thấy kết quả phù hợp, tôi di chuyển tệp siêu dữ liệu vào thư mục có tệp pdf.

tôi nhận được ngoại lệ này: java.nio.file.DirectoryNotEmptyException: C: \ test \ CGBA-RAC \ Part-A tại sun.nio.fs.WindowsFileCopy.move (WindowsFileCopy.java:372) tại sun.nio.fs.WindowsFileSystemProvider.move (WindowsFileSystemProvider.java:287) tại java.nio.file.Files.move (Files.java:1347) tại cgba.rac.errorprocessor.ErrorProcessor.findMatchingPdf (ErrorProcessor.java: 149) tại cgba.rac.errorprocessor.ErrorProcessor.matchErrorFile (ErrorProcessor.java:81) tại cgba.rac.errorprocessor.ErrorProcessor.main (ErrorProcessor.java:36)

+0

tôi thay đổi nội dung một số mã trong OP của tôi. – user2406854

+0

bản sao có thể có của [Cách sao chép tệp vào thư mục trong Java 7] (http://stackoverflow.com/questions/19694471/how-to-copy-a-file-to-a-directory-in-java- 7) – naXa

Trả lời

11
Files.move(file, cgbaFile.getParent(), StandardCopyOption.REPLACE_EXISTING); 

Để đạt được mục tiêu, bạn đang cung cấp thư mục bạn muốn chuyển tệp vào. Điều này là không chính xác. Mục tiêu phải là tên đường dẫn mới mà bạn muốn tệp có - thư mục mới cùng với tên tệp. Ví dụ, giả sử bạn muốn di chuyển /tmp/foo.txt đến thư mục /var/tmp. Bạn đang gọi số Files.move("/tmp/foo.txt", "/var/tmp") khi bạn cần gọi số Files.move("/tmp/foo.txt", "/var/tmp/foo.txt").

Bạn nhận được lỗi cụ thể đó vì JVM đang cố gắng xóa thư mục đích để thay thế nó bằng tệp.

Một trong số đó phải tạo ra con đường mục tiêu chính xác:

Path target = cgbaFile.resolveSibling(file.getFileName()); 

Path target = cgbaFile.getParent().resolve(file.getFileName()); 
+0

Cảm ơn bạn, đó là lời giải thích rõ ràng nhất mà tôi đã nhìn thấy cho đến nay. – user2406854

3
Path source = Paths.get("Var"); 
Path target = Paths.get("Fot", "Var"); 
try { 
    Files.move(
     source, 
     target, 
     StandardCopyOption.REPLACE_EXISTING); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

java.nio.file.Files là một điều cần thiết, do đó, đây là giải pháp đã chỉnh sửa. Vui lòng xem nếu nó hoạt động coz Tôi chưa bao giờ sử dụng lớp Tệp mới trước khi

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