对于一个特定的作业,我正在使用标准 C 下的顺序文件实现一个基本的数据存储系统,它一次不能加载超过 1 条记录。因此,基本部分是创建一个新文件,其中存储了我们对原始记录所做的任何事情的结果。前一个文件已重命名,并在工作名称下创建一个新文件。该代码在 Windows 7 上使用 MinGW 5.1.6 编译。
问题是,这个特定版本的代码(我的函数周围有几乎相同的版本)并不总是删除旧文件,因此重命名失败,因此存储的数据被 fopen() .
FILE *archivo, *antiguo;
remove("IndiceNecesidades.old"); // This randomly fails to work in time.
rename("IndiceNecesidades.dat", "IndiceNecesidades.old"); // So rename() fails.
antiguo = fopen("IndiceNecesidades.old", "rb");
// But apparently it still gets deleted, since this turns out null (and I never find the .old in my working folder after the program's done).
archivo = fopen("IndiceNecesidades.dat", "wb"); // And here the data gets wiped.
基本上,只要 .old 以前存在,就有可能没有及时删除它,以便 rename() 成功生效。内部和外部都没有可能的名称冲突。
奇怪的是它只适用于这个特定的文件。除了名称更改为 Necesidades.dat (发生在 3 个不同的函数中)之外,相同的片段工作得很好。
// I'm yet to see this snippet fail.
FILE *antiguo, *archivo;
remove("Necesidades.old");
rename("Necesidades.dat", "Necesidades.old");
antiguo = fopen("Necesidades.old", "rb");
archivo = fopen("Necesidades.dat", "wb");
关于为什么会发生这种情况的任何想法,和/或如何确保 remove() 命令在执行 rename() 时生效?(我想只要 fopen() 返回一个非空指针,就只使用一个 while 循环来强制调用 remove() ,但这听起来像是因为删除请求或其他东西溢出操作系统而乞求崩溃。)