You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用remove函数时遭遇Permission Denied错误的解决求助

解决Windows下remove函数Permission Denied问题

问题背景

我编写了deletar_pokemon函数,逻辑是从pokemonfinal.txt读取宝可梦数据,将除指定ID外的内容写入临时文件,关闭文件后删除原文件,再把临时文件重命名为原文件。但调用remove时触发Permission Denied错误。
已尝试的排查操作:

  • 检查文件关闭状态,显示正常
  • 用chmod修改文件权限
  • 改用unlink函数
  • 发现文件为只读属性,但Windows无法取消该属性

核心代码

void deletar_pokemon(){
    FILE* file = fopen("pokemonfinal.txt", "r");
    FILE* temp_file = fopen("temp____file.txt", "w"); // 用于写入修改内容的临时文件
    
    int contagem = contar_pokemons() - 2, pokemon_deletar = 0;
    int verificacao_barra_n = contagem;

    printf("请输入要删除的宝可梦ID: ");
    scanf("%d", &pokemon_deletar);

    struct POKEMON p;
    
    while(fscanf(file, "%d %s %c %d %d %d %d %d %d", &p.id, p.nome, &p.elemento, &p.atk, &p.matk, &p.def, &p.mdef, &p.hp, &p.sp) != EOF || contagem == 0){
        if(p.id != pokemon_deletar){
            if(contagem != verificacao_barra_n) fprintf(temp_file, "\n");
            fprintf(temp_file, "%d %s %c %d %d %d %d %d %d\n ", p.id, p.nome, p.elemento, p.atk, p.matk, p.def, p.mdef, p.hp, p.sp);
            contagem--;
        }
    }

    fclose(file);
    fclose(temp_file);
    remove("pokemonfinal.txt");
    rename("temp____file.txt", "pokemonfinal.txt");
}

排查用代码片段

1. 检查remove错误信息

if(remove("pokemonfinal.txt") != 0){
    perror("\nError");
}

2. 修改文件权限的尝试

if (chmod("./pokemonfinal.txt", 0777) != 0) {
    perror("\nError chmod");
}

3. 验证文件关闭状态

if(fclose(file) == EOF) {
    printf("File didnt close\n");
}

解决方法

1. 强制释放文件缓冲区(Windows专属)

Windows下C标准库的文件句柄可能因缓冲未刷新导致隐式占用,在fclose后调用_flushall()强制刷新所有缓冲区:

fclose(file);
fclose(temp_file);
_flushall(); // 强制刷新所有C标准库缓冲区
remove("pokemonfinal.txt");
rename("temp____file.txt", "pokemonfinal.txt");

2. 正确移除只读属性(Windows专属)

POSIX的chmod在Windows下兼容性差,改用Windows API的_chmod先移除只读属性:

// 先移除只读属性
if (_chmod("pokemonfinal.txt", _S_IWRITE) != 0) {
    perror("Failed to remove read-only attribute");
}
// 再执行删除和重命名
remove("pokemonfinal.txt");
rename("temp____file.txt", "pokemonfinal.txt");

3. 检查文件是否被其他进程占用

打开任务管理器,确认没有文本编辑器、调试工具或其他进程正在打开pokemonfinal.txt,关闭这些程序后再测试。

4. 使用绝对路径避免路径问题

如果程序在特定目录运行,临时文件可能创建在错误路径,改用绝对路径确保临时文件与原文件在同一目录:

// 示例:替换为你的项目实际路径
FILE* temp_file = fopen("C:/your-project-dir/temp____file.txt", "w");

5. 增强关键步骤的错误判断

在fopen等关键步骤增加失败判断,避免空句柄导致的隐式问题:

FILE* file = fopen("pokemonfinal.txt", "r");
if (!file) {
    perror("Failed to open pokemonfinal.txt");
    return;
}
FILE* temp_file = fopen("temp____file.txt", "w");
if (!temp_file) {
    perror("Failed to create temp file");
    fclose(file);
    return;
}

内容的提问来源于stack exchange,提问作者Matheus Ferrer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:47:47