【发布时间】:2014-10-27 09:05:38
【问题描述】:
打开示例
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
FILE * pFile;
for(int i=0; i < 1000000; i++)
{
bool ret = remove("C:\\abc.txt");
pFile = fopen ("C:\\abc.txt","w");
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
fclose (pFile);
}
else
{
printf("%d fopen() fails \n", count);
}
}
return 0;
}
这里调用remove后,调用pFile = fopen("C:\abc.txt","w");
有时即使在 C:\ 调用 remove 后 abc.txt 文件也不存在,但 fopen pFile 指针为空。
这有时会被复制,但并非总是如此。在此示例中,此问题被复制了 50/60 次。
请提出一些解决方案。
【问题讨论】:
-
您是否尝试过检查 errno 变量?系统可能会设置一些错误代码来帮助您解决此问题,您可以使用 perror 收集更多信息。也看看pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html
-
看起来像一个竞争条件。底层文件系统中可能的优化可以让
remove在真正清除所有内容并立即创建具有相同名称的文件之前返回。尝试在 remove 和 create 之间添加一个短暂的睡眠:它应该可以工作。 -
如果你想以“w”模式打开文件,请删除文件,我认为你不需要。
-
@SergeBallesta 我已经尝试过使用 Sleep 并且效果很好。但在我的原始应用程序中,我可能无法使用睡眠。上面的代码是一个测试应用程序,它证明 fopen 有时会失败,并且由于这个 fopen 问题,我的原始应用程序失败了。除了使用睡眠之外,还有其他解决方法吗?
-
删除文件并不一定会从磁盘中删除文件。您所看到的与机器上运行的反恶意软件或搜索索引器是一致的。当您创建文件时,它会立即生效,肯定是在您开始运行程序之前很短的时间。此类软件通过删除共享打开文件,试图将其对其他程序的影响降至最低。因此,您的 remove() 调用似乎可以正常工作(即使您从未实际检查过),但文件并没有消失。您可以通过先重命名文件来使其更具弹性,这不会被阻止。
标签: c++ c visual-c++