C语言如何删除最新创建文件并按顺序重命名其余日志文件
代码问题修复说明
原代码存在的问题
- 变量引用错误:
popen传入了未定义的变量commandBuff,实际应该传入之前构造好的命令变量cmd - 取最新文件逻辑错误:
ls -rt是按修改时间升序排列,输出的第一条是最旧的文件,完全不符合取最新log.0的需求 - 循环边界错误:循环从
max_files-1到0遍历,当fcount=0时会生成无效的log.-1文件名,且原log.0已经被删除,无需遍历到0 - 缺少异常判断:未判断
fscanf的返回值,如果管道读取失败,会导致后续执行rm命令出现不可预期的错误 - 命令稳定性差:用
ls取文件如果目录下存在非log命名的文件会导致误删,直接针对log.N格式文件操作更稳妥
修复方案
如果你的场景明确最新日志固定命名为log.0,可以直接省略调用ls的逻辑,简化代码同时避免误操作,修复后代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> int main() { char cmd[30]; char newLogFileName[30]; char oldLogFileName[30]; int fcount = 0; int max_files = 5; int ret; // 直接删除最新的log.0,无需调用ls sprintf(cmd, "rm log.0"); ret = system(cmd); if (ret != 0) { printf("删除log.0失败: %s\n", strerror(errno)); return -1; } // 循环从最大的编号开始重命名,到1停止,避免生成负编号 for (fcount = max_files - 1; fcount >= 1; --fcount) { snprintf(oldLogFileName, sizeof(oldLogFileName), "log.%d", fcount); snprintf(newLogFileName, sizeof(newLogFileName), "log.%d", fcount - 1); // 只在旧文件存在时执行重命名 if (access(oldLogFileName, F_OK) == 0) { rename(oldLogFileName, newLogFileName); } } return 0; }
如果你一定要用ls取最新文件的逻辑,需要将ls -rt | head -n 1修改为ls -t | head -n 1,同时把popen的参数改为cmd即可。
内容的提问来源于stack exchange,提问作者Himaja Krishna
相关产品推荐
相关产品推荐

