web-dev-qa-db-ja.com

Java 'file.delete()'は指定されたファイルを削除しない

現在、これはファイルを削除する必要があるものですが、機能していません。私はそれが許可の問題か何かかもしれないと思ったが、そうではなかった。私がテストしているファイルは空であり、存在するので、なぜそれが削除されないのか分かりません。

UserInput.Prompt("Enter name of file to delete");
String name = UserInput.readString();
File file = new File("\\Files\\" + name + ".txt");
file.delete();

どんな助けでも大歓迎です!

私は今持っています:

File file = new File(catName + ".txt");
String path = file.getCanonicalPath();
File filePath = new File(path);
filePath.delete();

プログラムが別のコンピューターに転送された場合でもファイルが見つかるように、実行時に正しいパスを見つけようとします。

38
Kimberley Lloyd

必ず現在の作業ディレクトリを見つけ、それに関連するファイルパスを記述してください。

このコード:

File here = new File(".");
System.out.println(here.getAbsolutePath());

...そのディレクトリを印刷します。

また、質問とは無関係に、File.separator OSに依存しないままにします。バックスラッシュはWindowsでのみ機能します。

32
Goran Jovic

問題は、閉じるのを忘れた出力ストリームが原因である可能性もあります。私の場合、ファイルを削除する前にファイルを操作していました。しかし、ファイル操作のある場所で、後で削除しようとしたファイルへの書き込みに使用した出力ストリームを閉じるのを忘れていました。

56
user2926391

同じ問題が発生しました!その後、ディレクトリが空ではないことに気付きました。別のスレッドで解決策を見つけました: Javaを介してディレクトリを削除できません

/**
 * Force deletion of directory
 * @param path
 * @return
 */
static public boolean deleteDirectory(File path) {
    if (path.exists()) {
        File[] files = path.listFiles();
        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                deleteDirectory(files[i]);
            } else {
                files[i].delete();
            }
        }
    }
    return (path.delete());
}
11
Maha

問題は、パスが間違っていることだと思います。これを試して:

UserInput.Prompt("Enter name of file to delete");
String name = UserInput.readString();
File file = new File("\\Files\\" + name + ".txt");
if (file.exists()) {
    file.delete();
} else {
    System.err.println(
        "I cannot find '" + file + "' ('" + file.getAbsolutePath() + "')");
}
6
Stephen C

ファイルを削除する場合は、最初にすべての接続とストリームを閉じます。その後、ファイルを削除します。

5
Anurag Mishra

他の方法で以前に開いたFileOutputStream/FileInputStreamをすべて閉じてから、削除してみてください。

3

私の場合、未処理の例外のために実行されなかったのはclose()でした。

void method() throws Exception {
    FileInputStream fis = new FileInputStream(fileName);
    parse(fis);
    fis.close();
}

Parse()で例外がスローされており、このメソッドでは処理されないため、ファイルが閉じられず、途中でファイルが削除され、その削除ステートメントが失敗し、削除しないと仮定します。

だから、代わりに私はこのようなコードを持っていて、それはうまくいった...

    try {
        parse(fis);
    }
    catch (Exception ex) {
        fis.close();
        throw ex;
    }

非常に基本的なJavaです。

1
Abdul Ahad

他の回答が示すように、Windowsでは、開いているファイルを削除できません。ただし、Windowsでファイルが削除されないようにすることができるもう1つのことは、それがMappedByteBuffer(またはDirectByteBuffer)にmmapされているかどうかです。バイトバッファはガベージコレクションされます。ここでガベージコレクションされる前にDirectByteBufferを強制的に閉じる(クリーニングする)ための比較的安全なコードがあります。 https://github.com/classgraph/classgraph/blob/master/src/main/ Java/nonapi/io/github/classgraph/utils/FileUtils.Java#L606ByteBufferをクリーニングした後、ファイルを削除できます。ただし、クリーニング後にByteBufferを使用しないでください。JVMがクラッシュします。

0
Luke Hutchison