我有一个应用程序,我试图通过以下方式实现“安全文件覆盖”:
A
)A
SHFileOperation
A
复制到最终目的地(B
)
DeleteFile
A
醇>
但是在步骤4中,DeleteFile
始终返回ERROR_SHARING_VIOLATION。整个过程需要几毫秒,所以我无法想象还有谁会干扰我的文件。几个问题:
A
的“其他流程”的更多信息?欢迎任何其他建议
答案 0 :(得分:5)
我最好的猜测是你需要一个步骤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简化文件代码的复制。
答案 1 :(得分:1)
删除文件的一种方法是使用FILE_FLAG_DELETE_ON_CLOSE
打开它,这将要求操作系统在关闭最后一个句柄后自动删除文件。如果使用FILE_SHARE_READ
创建文件,则SHFileOperation
应该能够读取它以进行复制,然后您可以立即关闭文件的句柄。当shell关闭文件的其句柄时,该文件将被自动删除。
答案 2 :(得分:0)
尝试使用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));
}