문제

나는 변경을 위해 디렉토리 트리를 모니터링 해야하는 Java 프로그램을 혼란스럽게합니다. 사용하는 JNI 코드가 있습니다 ReadDirectoryChangesW(). 디렉토리는 다음과 같이 열립니다.

HANDLE dirHandle = CreateFile(
    path, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
    OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL
);

그리고 나는 통과한다 dirHandle 에게 ReadDirectoryChangesW(). 그 모든 것이 잘 작동합니다.

문제는 코드의 다른 부분 (Java 쪽)이 사용한다는 것입니다. File.setLastModified() 파일 또는 디렉토리를 "터치"하려면 타임 스탬프를 "지금"으로 업데이트하십시오). 이것은 일반적으로 작동합니다. 그러나 사용하여 열린 디렉토리를 "터치"하려고 시도했을 때 실패합니다. CreateFile().

실제로 어떤 Windows 오류가 발생하는지 확인하려면 JDK 소스를 보았습니다. File.setLastModified() 오류를 인쇄 할 수 있도록 내 코드로 다시 구현했습니다. GetLastError(); 오류 오차는 다음과 같습니다. 오차는 다음과 같습니다. 오차는 다음과 같습니다.

ERROR_SHARING_VIOLATION (error 32)
"The process cannot access the file because it is being used by another process."

WTF? 그건 같은 프로세스. 나는 심지어 지나갔다 FILE_SHARE_READ 그리고 FILE_SHARE_WRITE 에게 CreateFile().

이 일을 할 수있는 방법이 있습니까?

더 많은 정보

기본 코드 구현 File.setLastModified() JDK에서 다음을 수행합니다.

h = CreateFileW(pathbuf, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, 0);

내가 첫 번째를 바꾸면 0 에게 FILE_SHARE_READ | FILE_SHARE_WRITE, 그것은 모두 작동합니다. 따라서 JDK 구현이 약간 깨진 것 같습니다. :(

그래서 내 질문은 이제 다음과 같이됩니다. File.setLastModified()?

도움이 되었습니까?

해결책

이 경우 오류 메시지가 약간 오해의 소지가 있지만보고있는 것은 정상적인 동작입니다.

디렉토리를 열어서 dwShareMode JDK는 사실상 제로로 설정되어 독점 액세스를 요구하므로 공유 위반 오류로 다른 액세스 시도가 실패합니다. 이는 다른 프로세스와 자신의 프로세스 내에서 액세스에 동일하게 적용됩니다.

그만큼 CreateFile 선적 서류 비치 설명 dwShareMode 매개 변수 :

이 매개 변수가 0이고 CreateFile이 성공하면 파일 또는 장치를 공유 할 수 없으며 파일 또는 장치의 핸들이 닫힐 때까지 다시 열 수 없습니다.

열린 핸들이있는 기존 요청에 지정된 액세스 모드와 충돌하는 공유 모드를 요청할 수 없습니다. CreateFile 실패 할 것입니다 GetLastError 기능이 반환됩니다 ERROR_SHARING_VIOLATION.

그래서 당신은 당신의 자신의 질문에 대답 한 것 같습니다. 당신은 관습이 필요합니다. setLastModified 지정하는 기능 FILE_SHARE_READ | FILE_SHARE_WRITE 디렉토리에 액세스 할 때.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top