我正在编写一个后台应用程序,以将文件循环复制到带有“优化以快速删除”策略集的 USB 记忆棒。但是,如果在此过程中(特别是在下面的 WriteFile() 调用中,它返回 ERROR FILE NOT FOUND)中删除了存储棒,则应用程序挂起,则驱动器将永久无法从任何其他应用程序访问,并且 PC 无法关闭/注销/重新启动等。所有正在运行的 Windows 资源管理器实例也会因此挂起。
我已将问题追溯到移除棒后进行的 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() 的几乎所有标志组合都无济于事。有没有人以前见过这个或有任何好主意如何避免发生这两个问题中的任何一个。我看到的驱动程序问题是否已在 vista 下静默修复?
谢谢你的帮助。