2017-12-01 3 views
0

Ich arbeite an einer Java 8-Anwendung, die eine Liste von Verzeichnissen/Dateien herunterlädt und diese in einem generierten Temp-Verzeichnis speichert (ein Verzeichnis in %LocalAppData%/Temp/). Nach dem Herunterladen wird eine XML-Datei generiert und als Text in einer Datenbank gespeichert.Kann einen temporären Ordner nicht mit FileUtils löschen

Ein Temp-Verzeichnis wird mit erstellt:

Path packageTargetDirectory = java.nio.file.Files.createTempDirectory("packages");

In meinem JUnit-Test, möchte ich die Funktionalität testen. Es klappt. Nach dem Test möchte ich, dass mein Testcode das Verzeichnis mit Inhalt rekursiv entfernt (mit der Methode org.apache.commons.io.FileUtils.deleteDirectory()).

Die Methode wird in einer Testfunktion aufgerufen, die mit der Anmerkung @After annotiert ist. Wenn die Methode aufrufen und testen Sie den Code erhalte ich eine IOException:

java.io.IOException: Unable to delete directory C:\Users\martin\AppData\Local\Temp\packages3096883734780765073\WindowsAzure.Storage

ich in das Verzeichnis bekam, und gerade versucht, es nach dem Test zu löschen hat lautete: ich es selbst löschen. Ich habe viele Dinge ausprobiert. Ich habe die org.apache.commons.io.FileUtils.forceDelete() Methode versucht. Ich habe auch versucht den folgenden Code auf Löschen:

Files.walkFileTree(testDataDirectory, new SimpleFileVisitor<Path>() { 
     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
      Files.delete(file); 
      return FileVisitResult.CONTINUE; 
     } 

     @Override 
     public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { 
      Files.delete(dir); 
      return FileVisitResult.CONTINUE; 
     } 
    }); 

Alles nicht die Verzeichnisstruktur auf Löschen. Der Inhalt scheint gelöscht zu sein.

Was könnte das Problem sein, ein Verzeichnis im temporären Ordner nicht löschen zu können? Ich dachte an geöffnete Ströme, aber ich habe anscheinend alle geschlossen.

Antwort

0

Warum verwenden Sie die vorhandene JUnit-Funktionalität nicht?

von java doc Kopiert:

Die TemporaryFolder Regel ermöglicht die Erstellung von Dateien und Ordnern, die gelöscht werden sollen, wenn die Testverfahren beendet (ob es geht oder nicht). Ob das Löschen erfolgreich ist oder nicht, wird von dieser Regel nicht überprüft. Wenn der Löschvorgang fehlschlägt, wird keine Ausnahme ausgelöst.

@Rule 
    public TemporaryFolder folder= new TemporaryFolder(); 

    @Test 
    public void testUsingTempFolder() throws IOException { 
     File createdFile= folder.newFile("myfile.txt"); 
     File createdFolder= folder.newFolder("subfolder"); 
     // ... 
    } 
+0

Da die Erstellung des Ordners in anderem Code erfolgt, nicht im Testcode. – Martin

+0

Im * normalen * Code lade ich Dateien herunter, und diese werden in einem temporären Verzeichnis gespeichert. Mit etwas Code wird eine Datei generiert. Ich gebe eine Path-Instanz zu dieser bestimmten Datei zurück. Ich erhalte das übergeordnete Element der Datei (welches das zu löschende Verzeichnis ist). – Martin

+0

Können Sie das Verzeichnis ändern, in dem Sie Dateien herunterladen? Und schließlich einen von JUnit verwenden. Dies ermöglicht definitiv ein besseres Testen. – Admit

Verwandte Themen