文件被删除后文件打开问题。 fopen状态在VC ++中失败

时间:2014-10-27 09:05:38

标签: c++ c visual-c++

fopen example

#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(&#34; C:\ abc.txt&#34;,&#34; w&#34;);被调用,

有时即使在C:\中,在删除被调用后,abc.txt文件也不存在,但是fopen pFile指针为空。

这种情况有时并非总是如此。在此示例中,此问题再现50/60次。

请提出一些解决方案。

2 个答案:

答案 0 :(得分:1)

如果您已经确定基础文件系统中的竞争条件存在问题,则修正它的正确方法是(如BLUEPIXY所建议的)只需删除remove调用:

pFile = fopen ("C:\\abc.txt","w");
如果文件不存在,

将创建该文件,如果文件存在则将其截断为0大小,这正是您所需要的。

答案 1 :(得分:0)

如果您需要在删除文件后立即创建文件,可以延迟fopen直到您确认旧的&#34; abc.txt&#34;文件已删除。

为此你需要引入一些循环来确认它,如下所示,

bool ret = remove("C:\\abc.txt");
FILE * rFile;
while(true)
{
    rFile = fopen ("C:\\abc.txt","r");
    if(rfile == null)
       break; //File Removed confirmed!!
    else
       sleep(100); //Loop around again...
}
pFile = fopen ("C:\\abc.txt","w");
if (pFile!=NULL)