무한 루프에서 파일을 만들고 삭제하는 (이름이 변경되지 않음) 간단한 테스트를 작성했습니다. 시험은 초 (! 때로는 77,000 이상 반복)의 몇 실행 한 다음이 예외와 함께 실패 않습니다File.createNewFile() randomly fails
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
은 실패합니다.
DeleteFile을 기능 가까이에 삭제 파일을 표시 :이 MSDN는 Win32 API 함수
DeleteFile
에 대한 말씀입니다. 따라서 파일의 마지막 핸들 닫을 때까지 파일 삭제가 발생하지 않습니다. 파일을 열려면 CreateFile에 대한 후속 호출은 ERROR_ACCESS_DENIED와 함께 실패합니다.
그래서 createNewFile
은 파일을 닫지 않습니까? 오픈 JDK 소스 파일 이 폐쇄 된 것을 우리에게 알려줍니다
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