文件打开问题,删除文件后.在VC++中fopen状态失败
File open issue, after file deleted. fopen status is failing in VC++
打开示例
#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)
相关文章:
- 参考资源文件VC++中的$(SolutionDir)
- 如何打开和读取16位.raw文件Vc++(Wince 平台)
- VC++ C2011 重定义错误 - 未使用的头文件
- 尝试使用VC++编译器构建Qt应用程序:"type_traits":没有这样的文件或目录
- VS2015:用于Linux开发的VC 没有这样的文件
- 无法创建或打开 *.VS 2015 中的 VC.db 文件(桌面快速版)更新 3RC
- 在 VC++ 中将类数据读取和写入二进制文件
- 如何在VC++中使用.lib、.dll和.exp文件
- 在swig.i文件中,如何为基于mfc的第三方dll解析ms-windows-vc++typedef类型
- 从VS2013中VC++中具有多个部分的文件读取数据
- VC 2010可执行文件未在其他计算机上运行-无错误
- VC++ 错误:错误 C1083:无法打开源文件:"=0x0401":没有此类文件或目录
- 在vc++中,只从文件的完整路径中查找文件名
- 如何扫描文件夹中的所有文件,包括VC++2008中的子文件夹
- 如何在vc++中将命名空间包含在另一个项目的另一个文件中
- 解决系统函数以运行来自 vc++ 的 arg 的 bat 文件
- VC++ 中的文件时间结构
- 如何为在 .props 文件中声明的非本机 VC 编译器 (GCC) 实现 MSBUILD 文件跟踪功能 (跟踪器.ex
- 将字符缓冲区转换为十六进制并写入文件 (VC++)
- 为什么致命错误C1083:不能打开源代码文件(vc++)