2013-08-16 4 views
0

Что я хочу, так это то, что когда мой проект будет завершен, файл, который он создал, будет удален (чтобы все файлы в нем были удалены). Что я делаюКаталог не удаляется

public void delete() { 
    File f = new File (JavCapture.tmpLocation + "/tmp"); 
    if (f.isDirectory()) { 
     f.delete(); 
     System.out.println("Deleted tmp folder!"); 
    } 
} 

Это не только не удалить папку, но она также не делает заявление для печати, что означает (ну, что я предполагаю, что это означает), что каталог не существует, но она делает ,

Также я делаю это место, используя это.

new File(tmpLocation + "/tmp").mkdir(); 
+2

Распечатайте местоположение файла, возможно, это не так, как вы думаете. –

+1

Чтобы удалить каталог, вы должны убедиться, что он пуст первым, что означает, что в каталоге нет файлов. –

+0

Попробуйте поймать исключение (приложите код от создания ссылки каталога к вызову delete в блоке try-catch) и распечатайте трассировку стека. Это может дать вам указания на то, что происходит не так. –

ответ

1

Вы могли бы попробовать что-то вроде этого:

public static boolean delete(final File directory){ 
    assert directory != null && directory.exists(); 
    if(!directory.isDirectory()) 
     return directory.delete(); 
    for(final File f : directory.listFiles()) 
     delete(f); 
    return directory.delete(); 
} 
0

Только пустая папка может быть удалена с помощью этого метода. Напишите рекурсивный метод, чтобы сначала удалить рекурсивно все файлы, а затем родительскую папку.

void delete(File file) { 
    if (file.isFile) 
     file.delete(); 
    else { 
     for (File sub: file.listFiles()) 
     delete(sub); 
     file.delete(); 
    } 
} 
+0

Вы не учитываете каталоги, которые могут находиться внутри каталога. –

+0

Спасибо, теперь это исправлено. – h22

0

Большую часть времени, семантика для удаления каталога отличаются от тех, для удаления файла. Обычно вам нужно записаться в каталог и удалить все в каталоге, прежде чем удалять каталог.

Как сказал @Audrius, вы должны сначала удалить все файлы в каталоге и все каталоги в каталоге, прежде чем сможете удалить каталог.

Оператор печати не выполняется, поскольку программа выдает ошибку. Если реализация «delete» файла является разумной, вы должны увидеть сообщение об ошибке; вы каким-то образом подавили ошибки?

0

проблема в том, что вы не можете удалить каталог, если он содержит что-то. Поэтому вы должны удалить рекурсивно содержимое каталога!

В Java 7:

public class DeleteDirVisitor extends SimpleFileVisitor<Path> { 

private Path baseDir; 

public DeleteDirVisitor() { 
} 

/** 
* If baseDir is specified all the subdirectory will be deleted but not basedir 
* 
* @param baseDir 
*/ 
public DeleteDirVisitor(Path baseDir) { 
    this.baseDir = baseDir; 
} 

@Override 
public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException { 
    if ((baseDir == null) || !dir.equals(baseDir)) { 
     Files.delete(dir); 
    } 
    return FileVisitResult.CONTINUE; 
} 

@Override 
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
    Files.delete(file); 
    return FileVisitResult.CONTINUE; 
} 

}

и польза:

Files.walkFileTree(Paths.get(new File("Your Path").getAbsolutePath()), new DeleteDirVisitor()); 
0

Вы можете использовать метод FileUtils.deleteDirectory() в Apache Commons IO

+0

Кажется немного экстремальным, чтобы использовать всю зависимость только для одного метода, не так ли? –

0

В Java 8 Я использую этот код для удаления папки и всего под ней:

Path path = Paths.get("tmp"); 
    if (Files.exists(path)) { 
     List<Path> allFiles = new ArrayList<Path>(); 
     Files.walk(path).forEach(pa -> allFiles.add(pa)); 
     Collections.reverse(allFiles); 
     allFiles.forEach(pa -> {try {System.out.println("deleting " + pa);Files.delete(pa);} catch(IOException e){}}); 
    } 

Удалите System.out в последней строке для бесшумного удаления.

Смежные вопросы