删除临时文件时Win32文件权限共享冲突

时间:2009-09-15 00:43:00

标签: winapi file-permissions

我有一个应用程序,我试图通过以下方式实现“安全文件覆盖”:

  1. 创建文件(A
  2. 使用数据填充A
  3. 通过SHFileOperation
  4. A复制到最终目的地(B
  5. 使用DeleteFile
  6. 删除A

    但是在步骤4中,DeleteFile始终返回ERROR_SHARING_VIOLATION。整个过程需要几毫秒,所以我无法想象还有谁会干扰我的文件。几个问题:

    1. 是否有更好的Win32(C / C ++)技术来执行上述操作?
    2. 如何获取有关阻止我删除文件A的“其他流程”的更多信息?
    3. 如何轻轻地( wink wink nudge nudge )强制Windows删除我的临时文件?
    4. 欢迎任何其他建议

3 个答案:

答案 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));
}