DeleteFile api 在进程终止之前不会删除文件

Posted

技术标签:

【中文标题】DeleteFile api 在进程终止之前不会删除文件【英文标题】:DeleteFile api doesn't delete file until process terminated 【发布时间】:2020-04-29 17:16:22 【问题描述】:

我已经实现了以下函数,它获取文件的路径,然后尝试从文件系统中删除它。

该函数不能正常工作,因为当我调用它删除文件时,直到我关闭程序才会删除该文件。当我关闭程序时,我指定的文件将被删除。不知道代码有什么问题:

bool DeleteFileOnSystem(const char* arg_path, const char* arg_name_file)

    char c_FilePath[MAX_PATH];

    strcpy_s(c_FilePath, MAX_PATH, arg_path);
    strcat(c_FilePath, arg_name_file);

    if (DeleteFile(c_FilePath))
        return true;
    else
        return false;

【问题讨论】:

“然后尝试删除它” - 事实上,这是一次尝试。 在某个时候失败的尝试。 Windows 的内部字符编码是 UTF-16LE,其中包括文件 I/O API。您不能使用 ANSI 编码对每个 Unicode 代码点序列进行编码。此代码尝试执行的操作。 【参考方案1】:

它确实删除了文件,没有任何问题。

显然您的程序在其他地方打开文件并且没有关闭它。所以句柄保持打开状态直到程序存在。

确保关闭文件句柄。

DeleteFile 的这种行为是一项功能,而不是错误。

【讨论】:

是的。问题解决了。当我使用 CreateFile API 创建文件时,我忘记关闭句柄文件。因此,DeleteFile 无法删除该文件。 Tnx。【参考方案2】:

当你打开DeleteFile documentation,你可以看到如下语句:

DeleteFile 函数在关闭时标记要删除的文件。因此,在文件的最后一个句柄关闭之前,不会发生文件删除。后续调用 CreateFile 以打开文件失败并显示 ERROR_ACCESS_DENIED。

在调用DeleteFile API 之前,确保文件的所有句柄都已关闭。

【讨论】:

以上是关于DeleteFile api 在进程终止之前不会删除文件的主要内容,如果未能解决你的问题,请参考以下文章

在终止进程之前保存 gmon.out

linuxrm-rf删除的文件怎么恢复

centosc程序异常终止

Python多处理 - 产生的进程终止时主进程不会继续

我们是不是应该在分叉进程终止之前分离共享内存

Xcode Debugging 进程只能通过重新启动 Mac OS 来终止