4

ファイルが空の場合、ベースディレクトリに到達するまでファイルを削除する簡単な方法を実行しようとしていますが、機能させることができません。

ファイルとその親ディレクトリを削除しますが、次の親はDirectoryNotEmptyException. 子ディレクトリは 1 つしかなく、前の繰り返しで削除されたため、実際には空です。

そのため、ファイルが削除され、その親が削除され、そこで停止します。上位のディレクトリは削除されません。

編集済み: (変更されたコード)

ディレクトリの削除に遅延が発生しているようで、次のディレクトリの空き状態のチェックでは、前のディレクトリがまだ削除されていません。そのため、ディレクトリが存在しなくなるまでチェックする while ループを追加しました。これが悪いテクニックなのかどうかはわかりませんが、私のニーズには合っています。

public static void removeFileAndParentsIfEmpty(Path path) throws IOException {
    if(path == null || path.endsWith(FilesPath.BILLS_DIRECTORY)) {
        return;
    }
    if (Files.isRegularFile(path)){
        Files.deleteIfExists(path);
    } else if (Files.isDirectory(path)){
        if(path.toFile().list().length == 0){
            Files.delete(path);
            while(Files.exists(path));
        }else{
            return;
        }
    } else {
        return;
    }
    removeFileAndParentsIfEmpty(path.getParent());
}

誰かがより良い解決策を提供できる場合、質問はまだ承認待ちです。ありがとう。

4

2 に答える 2

6

空のディレクトリの基本条件がないため、2 回目の再帰関数で、ディレクトリ自体の前に空のディレクトリの親を削除しようとします。これを修正するには、単純なコード変更で十分です。

public static void removeFileAndParentsIfEmpty(Path path)
        throws IOException {
    if(path == null || path.endsWith(BASEPATH)) return;

    if (Files.isRegularFile(path)) {
        Files.deleteIfExists(path);
    } else if(Files.isDirectory(path)) {
        try {
            Files.delete(path);
        } catch(DirectoryNotEmptyException e) {
            return;
        }
    }

    removeFileAndParentsIfEmpty(path.getParent());
}
于 2012-11-26T19:49:19.907 に答える
1

あなたの問題はここにあることをお勧めします

Files.delete(path.getParent());
removeFileAndParentsIfEmpty(path.getParent());

親フォルダーを削除し、メソッドを再度呼び出して同じフォルダーを削除しようとします...存在しないため、2番目の呼び出しは単に失敗し、何もせずに存在します。

ディレクトリが空かどうかを確認するチェックインも追加しますが、そのとおりです。例外はそれをキャッチします。使用するのは悪い習慣であり、探している条件の例外であると考えています-IMHO

于 2012-11-26T20:04:31.847 に答える