「クイック削除用に最適化」ポリシーが設定されたループ内のファイルを USB スティックにコピーするバックグラウンド アプリケーションを作成しています。ただし、このプロセスの途中でスティックが取り外された場合 (具体的には、以下の WriteFile() 呼び出しで、ERROR FILE NOT FOUND が返されます)、アプリケーションがハングし、他のアプリケーションからドライブに永久にアクセスできなくなり、PC をシャットダウンできなくなります。ログオフ/再起動など。結果として、Windows Explorer の実行中のすべてのインスタンスもハングします。
スティックが取り外され、上記のエラーが発生した後に行われた CloseHandle() 呼び出しに問題を追跡しました。スティックがなくなったため、CloseHandle() がドライバーのどこかで無期限にブロックされているように見えますか? とにかく、WriteFile() が ERROR FILE NOT FOUND を返す場合、CloseHandle() 呼び出しをスキップするだけで、この問題を回避できました。ただし、これにより別の問題が発生し、ファイルが修復不可能なほど壊れてしまい、それを修正する唯一の方法が chkdsk を使用するか、スティックを再フォーマットすることになります。
これは XP (SP2 および 3) でのみ発生することに注意してください。Vista ではこの問題は発生しないようです。コードのスニペットは次のとおりです。
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);
}
}
CreateFile() のフラグのほとんどすべての組み合わせを試しましたが、すべて役に立ちませんでした。誰かがこれを以前に見たことがありますか、または発生する2つの問題のいずれかを回避する方法について良いアイデアを持っています. 私が見ているのは、vista で黙って修正されたドライバーの問題ですか?
助けてくれてありがとう。