無限ループでファイルを作成して削除する(名前は変更されない)簡単なテストを作成しました。テストでは、秒(!時々、77,000以上の反復)のカップルのために実行し、その後、この例外で失敗しない:File.createNewFile()randomly fail
final File f = new File(pathname);
while (true) {
final boolean create = f.createNewFile();
if (!create) {
System.out.println("crate failed");
} else {
final boolean delete = f.delete();
if (!delete) {
System.out.println("delete failed");
}
}
}
どのようにこれが可能である:
Exception in thread "main" java.io.IOException: Access is denied
at java.io.WinNTFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(Unknown Source)
at DeleteTest.main(DeleteTest.java:11)
ここでテストロジックですか?削除呼び出しは失敗しません。それは伝えるだろう。したがって、常に削除は成功しますが、createNewFile
は失敗します。これは、MSDNは、Win32 API関数DeleteFile
についてこう言われる、
DeleteFileを機能が密接に削除用のファイルをマークします。したがって、 ファイルの最後のハンドルが閉じられるまで、ファイルの削除は発生しません。 ファイルを開くためのCreateFileへのその後の呼び出しは、 ERROR_ACCESS_DENIEDで失敗します。
したがってcreateNewFile
はファイルをクローズしませんか? OpenJDKのソースファイルがに閉じていることを教えてくれる:
JNIEXPORT jboolean JNICALL
Java_java_io_Win32FileSystem_createFileExclusively(JNIEnv *env, jclass cls,
jstring pathname)
{
jboolean rv = JNI_FALSE;
DWORD a;
WITH_PLATFORM_STRING(env, pathname, path) {
int orv;
int error;
JVM_NativePath((char *)path);
orv = JVM_Open(path, JVM_O_RDWR | JVM_O_CREAT | JVM_O_EXCL, 0666);
if (orv < 0) {
if (orv != JVM_EEXIST) {
error = GetLastError();
// If a directory by the named path already exists,
// return false (behavior of solaris and linux) instead of
// throwing an exception
a = GetFileAttributes(path);
if ((a == INVALID_FILE_ATTRIBUTES) ||
!(a & FILE_ATTRIBUTE_DIRECTORY)) {
SetLastError(error);
JNU_ThrowIOExceptionWithLastError(env, path);
}
}
} else {
JVM_Close(orv);
rv = JNI_TRUE;
}
} END_PLATFORM_STRING(env, path);
return rv;
}
は、誰もがこの動作を説明できますか?
、私は明示的行動があったと述べhttp://stackoverflow.com/a/23697734/715269 – Gangnus
@Gangnusランダム。そうです:いいえ、許可の問題ではありません。 –
私は参照してください。私は似たような問題の解決策を探していたので、答えをここに入れています。あなたのページは私が読んだページの1つでした。私が解決策を見つけたら、将来誰かを助けるためのリンクを付けました。それはあなたの質問に対する答えまたは答えとして意味されておらず、回答としても公開されていません。 – Gangnus