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

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

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

  1. 是否有更好的 Win32 (C/C++) 技术来执行上述操作?
  2. 如何获取有关阻止我删除文件的“其他进程”的更多信息 A?
  3. 我该如何轻轻地(眨眼 眨眼 轻推 轻推) 强制 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));
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top