Я создал простой тест, который создает и удаляет файл (имя не изменяется) в бесконечном цикле. Тест не работает в течение пары секунд (иногда более 77000 итераций!), А затем терпит неудачу с этим исключением:File.createNewFile() случайно сбой
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)
Вот тест логика:
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");
}
}
}
Как это возможно? Вызов вызова не прерывается. Это скажет. Поэтому удаление всегда выполняется успешно, но createNewFile
не работает. Это то, что MSDN говорит о win32 функции апи DeleteFile
:
Функция DeleteFile отмечает файл для удаления при закрытии. Поэтому удаление файла не происходит до тех пор, пока последний дескриптор файла не будет закрыт. Последующие вызовы CreateFile для открытия файла завершаются с ERROR_ACCESS_DENIED.
So 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, я явно указал, что поведение случайным образом. Итак: нет, это не проблема разрешения. –
Я вижу. Я помещаю ответ здесь только потому, что искал решение подобной проблемы, и ваша была одной из страниц, которые я читал, и когда я нашел решение, я добавил ссылку для помощи кому-то в будущем. Это НЕ означает ответ или ответ на ваш вопрос, и он также не публикуется в качестве ответа. – Gangnus