gpt4 book ai didi

c++ - 已删除的文件仍报告为存在(仅限 Windows)

转载 作者:可可西里 更新时间:2023-11-01 14:33:17 27 4
gpt4 key购买 nike

(请注意,这主要不是 Qt 问题)

在我看来QFile::exists()的返回值有时是不正确的。

考虑以下两个类似单元测试的片段(每个片段我都在一个循环中执行了几千次)

// create file
QFile file("test.tmp");
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY(file.write("some data") != -1);
file.close();

// delete file
QVERIFY(file.remove());

// assert file is gone
QVERIFY(!file.exists()); // <-- 5..10 % chance of failure

// create file
QFile file("test.tmp");
QVERIFY(file.open(QIODevice::WriteOnly));
QVERIFY(file.write("some data") != -1);
file.close();

// delete file
QVERIFY(file.remove());

// retry until file is gone (or until timeout)
for (auto i = 0; i < 10; i++)
{
if (!file.exists()) // <-- note that only the check is retried, not the actual delete
return;

QThread::yieldCurrentThread();
}

QFAIL("file is still reported as existing"); // <-- never reached in my tests

第一个单元测试大约有 100 次失败了 8 次。总是在最后一行代码(表示文件仍然存在)。第二个单元测试永远不会失败。

此行为是在使用 NTFS(带有 Qt 5.2.1)的 Windows 10 系统上观察到的。无法使用 ubuntu 16.04 LTS 在虚拟机上使用 ext4(使用 Qt 5.8.0)复制它

不确定这是否有帮助:

所以我的问题是:

  • 发生了什么事?
  • 我可能感兴趣的含义是什么?

更新:

为了澄清:我希望得到像“这是由 NTFS 功能‘bills-fancy-caching-magic’”这样的答案。从那里我想知道 Qt 是否有意查看此功能。

最佳答案

根据Windows API documentation ,它是定义的行为:

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.

这似乎是 Windows 内核的一个属性,因此不限于 NTFS。

这种行为似乎是不可预测的,因为其他服务(例如病毒扫描程序)可能会打开有问题的文件。

关于c++ - 已删除的文件仍报告为存在(仅限 Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51301380/

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