使用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
相关产品推荐
相关产品推荐

