c - stdio 的 remove() 并不总是按时删除

标签 c windows file delete-file

对于一项特定的作业,我正在使用标准 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() ,但这听起来像是因为删除请求或其他东西使操作系统溢出而导致崩溃。)

最佳答案

所以突然间,在阅读了 Scott 提到的权限之后,我想到了“Permission Denied”并应用了一些 Google。 Turned out it's a pretty common, if obscure, error. caf 是对的,它在另一段代码中。也就是说,我忘记在用于显示内容的函数中关闭同一个文件。因为我没有跟踪那个特定的细节,所以它看起来是随机的。

免责声明:每周的数学作业只占很少的 sleep 时间。 ¬¬

关于c - stdio 的 remove() 并不总是按时删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2626744/

相关文章:

c++ - 用于 python 列表的 SWIG typemap to double *

windows - 如何在 Go 中读取文件属性

php - 使用文件句柄获取文件名(或删除文件)

django - 为什么静态文件在网络服务器中单独提供?

mysql - 读取文件,按选项卡解析并使用 Bash 脚本插入 mysql 数据库

c - 二维字符数组中的邻居数量不正确 (C)

c - 如何链接 geany 中的 math.h 库?

c# - 使用java或其他编程语言将小图标添加到任何文件/文件夹作为Windows中的图标

c++ - 从 DLL 访问 Windows CE .EXE 符号

c++ - 是否存在允许任意精度指数的 C/C++ 任意精度浮点库?