2014-10-31 2 views
6

Ich bin neu in Javas Paket nio und ich kann nicht herausfinden, wie man eine Datei von einem Verzeichnis in ein anderes bekommt. Mein Programm soll ein Verzeichnis und seine Unterverzeichnisse und Prozessdateien anhand bestimmter Bedingungen durchlesen. Ich kann alle Dateien mit Files.walkFileTree bekommen, aber wenn ich versuche, sie zu verschieben, bekomme ich eine java.nio.file.AccessDeniedException.Wie kann ich eine Datei in ein nicht leeres Verzeichnis verschieben?

Wenn ich versuche, sie zu kopieren, erhalte ich eine DirectoryNotEmptyException. Ich konnte bei Google keine Hilfe finden. Ich bin sicher, dass es eine einfache Möglichkeit gibt, eine Datei von einem Verzeichnis in ein anderes zu verschieben, aber ich kann es nicht herausfinden.

Das ist, was ich, dass der Versuch bekommt die 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(); 
      } 
     } 
    } 
} 

Ich bin durch eine Liste von Dateien iterieren, eine .meta Datei mit einem PDF mit dem gleichen Namen zu entsprechen versucht. Sobald ich die Übereinstimmung gefunden habe, verschiebe ich die Metadatendatei in das Verzeichnis mit der PDF-Datei.

Ich erhalte diese Ausnahme: java.nio.file.DirectoryNotEmptyException: C: \ test \ CGBA-RAC \ Part-A bei sun.nio.fs.WindowsFileCopy.move (WindowsFileCopy.java:372) bei sun.nio.fs.WindowsFileSystemProvider.move (WindowsFileSystemProvider.java:287) unter java.nio.file.Files.move (Files.java:1347) bei cgba.rac.errorprocessor.ErrorProcessor.findMatchingPdf (ErrorProcessor.java: 149) bei cgba.rac.errorprocessor.ErrorProcessor.matchErrorFile (ErrorProcessor.java:81) bei cgba.rac.errorprocessor.ErrorProcessor.main (ErrorProcessor.java:36)

+0

ich einige Codes in meinem OP bearbeitet. – user2406854

+0

mögliches Duplikat von [So kopieren Sie eine Datei in ein Verzeichnis in Java 7] (http://stackoverflow.com/questions/19694471/how-to-copy-a-file-to-a-directory-in-java-) 7) – naXa

Antwort

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

Für das Ziel, sind Sie das Verzeichnis bietet Ihnen die Datei in verschoben werden soll. Das ist falsch. Das Ziel sollte der neue Pfadname sein, den die Datei haben soll - das neue Verzeichnis plus den Dateinamen.

Angenommen, Sie möchten /tmp/foo.txt in das Verzeichnis /var/tmp verschieben. Sie rufen Files.move("/tmp/foo.txt", "/var/tmp"), wenn Sie Files.move("/tmp/foo.txt", "/var/tmp/foo.txt") anrufen sollten.

Sie erhalten diesen spezifischen Fehler, weil die JVM versucht, das Zielverzeichnis zu löschen, um es durch die Datei zu ersetzen.

Einer von ihnen sollte den richtigen Zielpfad generieren:

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

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

Danke, das war die klarste Erklärung, die ich bisher gesehen habe. – 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 ist eine Notwendigkeit, also hier ist die editierte Lösung. Bitte sehen, ob es funktioniert Coz ich nie die neuen Dateien Klasse verwendet haben, bevor

Verwandte Themen