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

File open issue, after file deleted. fopen status is failing in VC++

本文关键字:文件 VC++ fopen 失败 状态 问题 删除      更新时间:2023-10-16

打开示例

#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指针为null。

这种情况有时会重现,但并不总是如此。在这个例子中,这个问题被复制了50/60次。

请提出一些解决方案。

如果您已经确定这是底层文件系统中的竞争条件问题,那么解决它的正确方法是(按照BLUEPIXY的建议)简单地删除remove调用:

pFile = fopen ("C:\abc.txt","w");

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

如果您确实需要在文件被删除后创建一个文件,您可以推迟fopen,直到您确认旧的"abc.txt"文件被删除。

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

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)