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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 00:27:02