gpt4 book ai didi

c - DeleteFile() 或 unlink() 调用成功但不删除文件

转载 作者:可可西里 更新时间:2023-11-01 14:49:38 25 4
gpt4 key购买 nike

我遇到了这个奇怪的问题。删除文件 unlink()在我的代码中调用了 API。此调用删除文件并在非 Windows 平台上成功。在 Windows 上它成功(返回 0)但不删除文件。

为了实验,我添加了一个循环来重复调用相同的 API。在第二次迭代中,我得到了一个权限被拒绝的错误,错误代码 =13。尽管在文件上设置了读/写属性,并且程序具有访问该文件的完全权限。

然后我调用DeleteFile()而不是 unlink() API。令我惊讶的是,我看到了相同的结果,调用成功,即返回 1,但文件没有被物理删除。

我通过 unlocker 实用程序进行了检查,除了试图删除此文件的程序外,没有其他程序正在访问该文件。

有谁知道还有什么问题吗?

编辑1:只是为了确保文件在删除时没有打开。我在创建文件时保存了句柄,并在删除文件之前尝试关闭,但出现错误“'未打开'(错误代码:9 - 错误的文件描述符)”。因此,我得出结论,文件在删除时没有打开。

编辑2根据要求,这里是用于创建和删除文件的代码的简化版本。

// Code to create the file
int create_file(const char* path)
{
HANDLE osfh; /* OS handle of opened file */
DWORD fileaccess; /* OS file access (requested) */
DWORD fileshare; /* OS file sharing mode */
DWORD filecreate; /* OS method of opening/creating */
DWORD fileattrib; /* OS file attribute flags */
SECURITY_ATTRIBUTES SecurityAttributes;


SecurityAttributes.nLength= sizeof(SecurityAttributes);
SecurityAttributes.lpSecurityDescriptor= NULL;
SecurityAttributes.bInheritHandle= !(oflag & _O_NOINHERIT);



fileaccess= GENERIC_WRITE;
fileshare= FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
filecreate= CREATE_NEW;


if ((osfh= CreateFile(path, fileaccess, fileshare, &SecurityAttributes,
filecreate, fileattrib, NULL)) == INVALID_HANDLE_VALUE)
{
// error handling
}

}

//Code to delete the file -
int remove_file (const char* name)
{
if ((err = unlink(name)) == -1)
{ //Error handling }
}

编辑3正如 Joachim Pileborgicabod 所指出的,如果文件仍处于打开状态,DeleteFile() 不会删除文件。按照 Remy Lebeau 的建议,使用进程资源管理器。当我从进程资源管理器文件中关闭文件时,我发现确实打开了一个文件句柄,就像一个魅力一样删除:)

我在 Edit1 中也提到过当我试图关闭文件时出现错误。发生这种情况是因为我从 createfile() 获取的文件描述符不是 CreateFile() API 返回的实际句柄,而是逻辑映射句柄,这是由于支持其他非 Windows 平台的底层代码复杂性所致。无论如何,现在我明白了问题的根本原因,但我期待如果一个带有打开句柄的文件被传递给 DeleteFile() API 那么它应该在第一次尝试时失败而不是成功并等待打开句柄关闭.

最佳答案

假设您调用了 Createfile 函数,然后调用了您的 remove_file 函数...您仍然有一个打开文件的句柄。 WinAPI 函数 CreateFile 如果成功,将在文件上保持打开的句柄。在您提供的代码中,您不会关闭该句柄。

来自 DeleteFile 上的文档:

The DeleteFile function marks a file for deletion on close. Therefore, the file deletion does not occur until the last handle to the file is closed. Subsequent calls to CreateFile to open the file fail with ERROR_ACCESS_DENIED.

我的猜测是您仍然有一个打开的句柄,当您关闭该句柄时文件将被删除。

但是,您的示例代码不完整,因此很难判断。

关于c - DeleteFile() 或 unlink() 调用成功但不删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27270374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com