首页 > 解决方案 > 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,这应该意味着它是成功的,但文件仍然存在于目录中。我说不出话来。

标签: cwindowsfile-pointer

解决方案


代码没有到达remove声明。


推荐阅读