c - C remove() 函数在 windows 环境下不删除目标文件
问题描述
我正在编写一个程序,询问用户一个文件名,如果它不存在则创建它。在程序结束时,我想检查创建的程序是否为空,如果是,则将其删除。不删除它然后使用相同的文件名运行程序会破坏检测输入的方式。
我尝试使用rewind()
回到开头,然后检查feof()
文件的开头是否是 EOF 字符,但这不起作用。
然后,我在网上搜索了一下,找到了一个方法,fseek()
以前是走到文件末尾,然后检查ftell()
文件末尾是否在位置0,但还是不行。
我回去又摸索了一下,发现问题可能是我没有fclose()
先用过,于是我又试了前两种尝试的解决方法,这次一定要先关闭文件再尝试删除。还是没有骰子。
我尝试检查errno
设置的内容,并得到了2: No such file or directory
. 这显然是错误的,因为如果是这样,那就意味着我已经完成了我的目标,当我检查工作目录时,文件仍然存在。
我完全不知道接下来要尝试什么。谁能指出我正确的方向?
以下是我尝试删除文件的方法(fp
是文件指针,file
是一个带有指向文件名的字符指针fp
。):
尝试1:
rewind(fp);
if(feof(fp)){
remove(file);
}
尝试2:
fseek(fp, 1, SEEK_END);
long size = ftell(fp);
if(size == 0){
remove(file);
}
尝试 3:
fseek(fp, 1, SEEK_END);
long size = ftell(fp);
fclose(fp);
if(size == 0){
remove(file);
}
尝试4:
rewind(fp);
int empty = 0;
if(feof(fp)){
empty = 1;
}
fclose(fp);
if(empty == 1){
remove(file);
}
更新:这里有几个 MCVE,每种方法一个。
#include <stdio.h>
#include <errno.h>
int main() {
FILE *fp;
char file[40];
scanf(" %[^\n]s", file);
fp = fopen(file, "r");
if(fp == NULL){
fp = fopen(file, "w");
int result;
rewind(fp);
int empty = 0;
if(feof(fp)){
empty = 1;
}
fclose(fp);
if(empty == 1){
result = remove(file);
}
printf("%d\n", result);
printf("%d\n", errno);
return 0;
}
版本 2:
#include <stdio.h>
#include <errno.h>
int main() {
FILE *fp;
char file[40];
scanf(" %[^\n]s", file);
fp = fopen(file, "r");
if(fp == NULL){
fp = fopen(file, "w");
int result;
fseek(fp, 1, SEEK_END);
long size = ftell(fp);
fclose(fp);
if(size == 0){
result = remove(file);
}
printf("%d\n", result);
printf("%d\n", errno);
return 0;
}
更新 2:
我刚刚意识到,当我制作 MCVE 时,当我运行它们时,它result
正在返回0
,这应该意味着它是成功的,但文件仍然存在于目录中。我说不出话来。
解决方案
代码没有到达remove
声明。
推荐阅读
- django - django中ImageField的属性是什么?
- javascript - 问题在 Y 轴上对行图进行排序。dc-js 行图
- c++ - 跨共享库的模板中的局部静态变量
- jquery - laravel - jquery/ajax 数据为空
- django - 尝试在 Django 管理面板中删除用户时出现编程错误
- c# - 嵌入式南希不听
- html - 如何使用 Bulma CSS 框架防止列溢出模式
- php - 在开始新生成的会话之前禁用 [session.use_strict_mode]
- data-science - K 折交叉验证 多少折?
- react-native - React Native Navigation:重新加载选项卡和侧抽屉时不会触发深层链接事件