Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 文件删除后,文件打开问题。fopen状态在VC+中失败+;_C++_C_Visual C++ - Fatal编程技术网

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

C++ 文件删除后,文件打开问题。fopen状态在VC+中失败+;,c++,c,visual-c++,C++,C,Visual C++,fopen示例 #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)

fopen示例

#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;
}
#包括
int _tmain(int argc,_TCHAR*argv[]
{
文件*pFile;
对于(int i=0;i<1000000;i++)
{
bool ret=remove(“C:\\abc.txt”);
pFile=fopen(“C:\\abc.txt”,“w”);
if(pFile!=NULL)
{
FPUT(“fopen示例”,pFile);
fclose(pFile);
}
其他的
{
printf(“%d fopen()失败\n”,计数);
}
}
返回0;
}
这里,在调用remove之后,pFile=fopen(“C:\abc.txt”,“w”);叫做

有时,甚至在C:\abc.txt文件中,调用remove后也不存在,但fopen pFile指针为空

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


请建议一些解决方案。

如果您已经确定这是底层文件系统中的争用条件问题,则正确的解决方法是(按照BLUEPIXY的建议)只需删除
删除
调用:

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)

您是否尝试检查errno变量?系统可能会将其设置为一些错误代码,这可能会帮助您解决此问题,您可以使用perror收集更多信息。还可以看看比赛情况。底层文件系统中可能的优化可以让
remove
在所有内容真正清除之前返回,并立即创建同名文件。尝试在“删除”和“创建”之间添加一个短睡眠时间:应该可以。如果要以“w”模式打开文件,请删除该文件,我认为您不需要。@SergeBallesta我已经尝试过睡眠,效果很好。但在我最初的应用程序中,我可能无法使用睡眠。上面的代码是一个测试应用程序,它证明了fopen有时会失败,并且由于这个fopen问题,我的原始应用程序失败了。除了使用睡眠,还有其他解决方法吗?删除文件不一定会从磁盘中删除该文件。您所看到的与机器上运行的反恶意软件或搜索索引器一致。当您创建文件时,它会立即生效,当然在您开始运行程序之前的很短时间内。这种软件以删除共享方式打开文件,试图将其对其他程序的影响降至最低。因此,您的remove()调用似乎工作得很好(即使您从未实际检查),但文件并未消失。您可以通过先重命名文件使其更具弹性,这不会被阻止。如果文件被删除,它将以写模式打开,否则以rb+模式打开。因此,在应该删除它并再次创建它的情况下,问题就出现了。我还检查了remove()函数的返回值,以确认删除是否成功。令我惊讶的是,我发现有时候remove会返回成功的值,而fopen会将“权限被拒绝”作为错误而失败,有时候remove()函数会失败,但fopen会成功。remove()似乎是不可靠的函数。@Aakash:
remove
本身不是不可靠的函数。但在Windows下,如果在打开的文件上调用它(特殊访问模式除外),则会失败,因此您也会遇到同样的竞争问题。我想你应该重新考虑你的算法,不要做删除调用。在您的用例条件下,它是不安全的。谢谢您提供的信息。我会查一下别的办法。谢谢