1

ディレクトリ内のフォルダーからすべてのファイルを削除する方法について質問しましたが、フォルダーは保持します。これは次の場所にあります。

フォルダーではなくディレクトリのファイルを削除する方法

目的の解決策の 1 つは、これを達成するために再帰を使用することでした。

public void DeleteFiles() {
    File file =
       new File(
          "D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/"+
          "resources/pdf/");
    System.out.println("Called deleteFiles");
    if (file.isDirectory()) {
        for (File f : file.listFiles()) {
            DeleteFiles();
        }
    } else {
        file.delete();
    }
}

ただし、スタックオーバーフローエラーが発生するまで、呼び出されたdeleteFilesでいっぱいのコンソールを取得するだけで、ディレクトリを調べてファイルを見つけて削除するようには見えません。どうすればこれを達成できますか?

4

3 に答える 3

4

より単純な解決策がある場合、再帰は問題を引き起こします。commons-ioを使用:

import java.io.File;
import org.apache.commons.io.FileUtils;
import static org.apache.commons.io.filefilter.TrueFileFilter.TRUE;

File root = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");
Iterator<File> files = FileUtils.iterateFiles(root, TRUE, TRUE);
for (File file : files) {
    file.delete();
}

またはJDK7を使用:

import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

Path root = Paths.get("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
            throws IOException {
        file.delete();
        return FileVisitResult.CONTINUE;
    }
})
于 2013-02-23T16:16:11.003 に答える
2
public void DeleteFiles() {
    File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");
    System.out.println("Called deleteFiles");
    DeleteFiles(file);
}

public void DeleteFiles(File file) {
    if (file.isDirectory()) {
        for (File f : file.listFiles()) {
            DeleteFiles(f);
        }
    } else {
        file.delete();
    }
}
于 2013-02-23T16:00:33.913 に答える
2
 File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");

同じファイルを何度も作成しています。関数の外でそのファイルを宣言します。

あなたの再帰は提案されたものとは異なります。

public void DeleteFiles( File file) {
    System.out.println("Called deleteFiles");
    if (file.isDirectory()) {
        for (File f : file.listFiles()) {
            DeleteFiles(f);
        }
    } else {
        file.delete();
    }
}
于 2013-02-23T15:58:19.177 に答える