删除临时文件时发生 Win32 文件权限共享冲突
-
07-07-2019 - |
题
我有一个应用程序,我试图通过以下方式实现“安全文件覆盖”:
- 创建文件(
A
) - 填充
A
有数据 - 复印
A
到达最终目的地(B
) 通过SHFileOperation
- 正在删除
A
使用DeleteFile
然而在步骤4中 DeleteFile
始终返回 ERROR_SHARING_VIOLATION。整个过程需要几毫秒,所以我无法想象还有谁会干扰我的文件。有几个问题:
- 是否有更好的 Win32 (C/C++) 技术来执行上述操作?
- 如何获取有关阻止我删除文件的“其他进程”的更多信息
A
? - 我该如何轻轻地(眨眼 眨眼 轻推 轻推) 强制 Windows 删除我的临时文件?
欢迎任何其他建议
解决方案
我最好的猜测是你需要一个步骤2.5)关闭1)
中创建的文件句柄你用什么来创建/打开文件?
如果您使用CreateFile,请确保在调用delete之前关闭文件句柄,否则请确保指定共享标志 FILE_SHARE_DELETE
。
HANDLE hFile = CreateFile("C:\\test.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, CREATE_ALWAYS, 0, NULL);
您可能还希望使用Win32 API简化文件代码的复制的CopyFile 。
其他提示
删除文件的一种方法是用 FILE_FLAG_DELETE_ON_CLOSE
,它将请求操作系统在关闭最后一个句柄后自动删除该文件。如果使用 FILE_SHARE_READ
创建文件,那么 SHFileOperation
应该能够读取它以复制它,然后您可以立即关闭文件的句柄。当shell关闭文件的其句柄时,该文件将被自动删除。
尝试使用 www.sysinternals.com 中的 Handles.exe 来查看该文件是否正在使用以及如何使用。
您可以使用 GetLastError 和 FormatMessage 来获取有关上次失败函数的更多信息:
一些示例代码:
char tx2[1024];
DWORD l;
if(l = GetLastError())
{
LPVOID lpMessageBuffer = 0;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
l,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //The user default language
(LPTSTR) &lpMessageBuffer,
0,
NULL
);
SetLastError(0);
MessageBox(NULL, tx2, "MyApplication", MB_ICONINFORMATION | MB_OK | (MB_SETFOREGROUND | MB_TOPMOST | MB_TASKMODAL));
}
不隶属于 StackOverflow