"빠른 제거를 위해 최적화"정책 세트가있는 루프의 파일을 USB 스틱에 복사하는 백그라운드 애플리케이션을 작성하고 있습니다. 그러나 응용 프로그램이 중단되면 스틱이이 프로세스 (특히 아래의 WriteFile() 호출에서 ERROR FILE NOT FOUND를 반환 함)를 통해 제거되면 드라이브가 다른 응용 프로그램에서 영구적으로 액세스 할 수 없으며 PC를 종료/로그 오프/재시작 등. 실행중인 모든 Windows 탐색기 인스턴스도 결과로 중지됩니다.USB 스틱에 파일을 쓰면 갑자기 꺼내지면 파일 손상/잠김이 발생합니다.
스틱이 제거되고 위의 오류가 발생한 후 CloseHandle() 호출에이 문제를 추적했습니다. 마치 막대기가 더 이상 존재하지 않기 때문에 CloseHandle()이 드라이버에서 무한정 차단하고있는 것처럼 보입니다. 어쨌든, WriteFile()이 ERROR FILE NOT FOUND를 반환하면 CloseHandle() 호출을 생략함으로써이 문제를 해결할 수있었습니다. 그러나 이렇게하면 파일이 복구 불가능하게 손상되고 chkdsk를 사용하거나 스틱을 다시 포맷하는 유일한 방법이있는 경우가 자주 있습니다.
XP (SP2 및 3)에서만 발생하며 Vista에서는 문제가없는 것 같습니다. 코드의 조각은 다음과 같습니다 : 나는 아무 소용를 CreateFile() 모든 플래그의 거의 모든 조합을 시도했습니다
HANDLE hFile = CreateFile(szFile,
GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
CREATE_ALWAYS,
FILE_FLAG_WRITE_THROUGH,
NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
if (!WriteFile(hFile, pBuffer, dwBufferSize, &dwWritten))
{
int nLastError = GetLastError();
}
// If usb stick is removed during WriteFile(), ERROR_FILE_NOT_FOUND usually results.
// If handle is closed at this point then drive is inaccessible.
// If CloseHandle() is skipped, then file corruption occurs instead
if (nLastError != ERROR_FILE_NOT_FOUND)
{
CloseHandle(hFile);
}
}
. 아무도 이것을 본 적이 없거나 두 가지 문제 중 하나가 발생하지 않도록하는 좋은 아이디어가 있습니다. 나는 비스타에서 조용히 고쳐진 운전자 문제를보고있다.
도움 주셔서 감사합니다.
답장을 보내 주셔서 감사합니다. 그것은 실제로 * my * 응용 프로그램의 매달리기 문제를 해결할 것이지만, 손상은 이미 파일 시스템의 마운트 된 드라이브에서도 이미 수행되었습니다. 다른 응용 프로그램에서는 여전히 액세스 할 수 없으므로 PC는 종료/로그 오프 등의 시간에 멈 춥니 다. –
스레드를 중단하지 마십시오. 이것이 도움이 될만한 유스 케이스는 없습니다. 당신은 오직 '국가 부패'등의 위험이 있습니다. – Christopher
스레드가 멈 추면 어떻게 할 수 있습니까? 나는이 완벽한 솔루션입니다 말을하지만, 스레드를 중단하고 위험 상태가 손상 IMO 확실히 전체 응용 프로그램을 매달려 뛰는 아니에요. –