C语言批量移动MP4文件时rename函数执行失败原因排查
错误原因分析
- 1. 目标父目录
new不存在rename函数不具备自动创建中间目录的能力,初始代码没有预先创建new文件夹,直接向./new/xxx.mp4路径移动文件时,系统找不到目标父目录,返回errno=13(Permission denied)错误。你修复版里添加的system("MKDIR new")就是解决这个问题的。 - 2.
test标记未重置,导致非mp4文件/目录被误处理
初始代码里的test变量仅在初始化时赋值为0,第一次识别到mp4文件后test被设为1,后续遍历所有目录项(包括.、..、普通文件、子目录)都会被判定为mp4文件执行rename操作,这就是你看到new文件夹下出现K3B8.mp4这类文件夹的原因:你把当前目录下的其他子目录重命名移动到了new路径下。修复版里加了if (test) { test = 0; ... }的重置逻辑就是解决这个问题的。 - 3. 打开的文件未关闭,导致文件被占用无法重命名
初始代码里有多余的file = fopen(nome,"r");操作,打开文件后没有调用fclose释放句柄,操作系统会判定文件处于占用状态,拒绝重命名请求,这也是rename失败的常见原因。 - 4. mp4后缀匹配逻辑存在错误
初始代码的后缀匹配循环写为for (int i=0;i<nome[i]!='\0';i++),由于运算符优先级问题,实际循环判断逻辑完全不符合预期,会导致后缀匹配出错、漏判/误判文件类型。 - 冗余代码说明
代码中存在多句h=rand()%127;语句,赋值后立即被后续赋值操作覆盖,属于无效代码,不影响运行但可以直接删除。 - 额外优化建议
现有逻辑生成的随机文件名有概率重复,rename遇到已存在的目标文件也会失败,建议增加目标文件是否存在的判断,重复时重新生成随机名。
单文件测试代码可正常运行的原因
- 测试时
new文件夹已经被之前的操作创建过 - 只处理单个固定文件,不存在
test标记未重置的问题 - 没有多余的
fopen操作占用文件
内容的提问来源于stack exchange,提问作者c4xp
相关产品推荐
相关产品推荐

