2

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

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

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

  1. 是否有更好的 Win32 (C/C++) 技术来执行上述操作?
  2. 如何获得有关阻止我删除文件的“其他进程”的更多信息A
  3. 我如何轻轻地(眨眼眨眼轻推)强制 Windows 删除我的临时文件?

欢迎任何其他建议

4

3 回答 3

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来简化文件代码的复制。

于 2009-09-15T00:45:56.257 回答
1

删除文件的一种方法是打开它,FILE_FLAG_DELETE_ON_CLOSE请求操作系统在文件的最后一个句柄关闭后自动删除文件。如果您使用 then 创建文件,FILE_SHARE_READSHFileOperation应该能够读取它并复制它,然后您可以立即关闭文件的句柄。当 shell 关闭的文件句柄时,文件将被自动删除。

于 2009-09-15T00:50:27.297 回答
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));
}
于 2009-09-15T11:53:50.203 回答