根据大小重命名和移动我的文件在 c 中并不总是有效。为什么?

Renaming & moving my file based on the size is not always working in c. Why?

我有一个用 C 编写的应用程序,它生成各种数据参数,我正在将这些参数登录到名为 debug_log.txt 的文本文件中。每当此日志文件达到 1 MB 时,我都会使用时间戳 ex debug_log_20200106_133000.txt 重命名文件名并将其移动到同一目录中。然后我将重新打开 debug_log.txt 以记录新参数。

if(stat("/home/log/debug_log.txt", &statFiledbg) == 0) 
{
    if(statFiledbg.st_size >= 1048576) // 1MB
    { 
        current_time = time(0);
        strftime(time_buffer, sizeof(time_buffer), "%Y%m%d_%H-%M-%S", gmtime(&current_time));
        sprintf(strSysCmddbg, "mv /home/log/debug_log.txt /home/log/debug_log%s.txt", time_buffer);
        system(strSysCmddbg);
        fp_dbglog = freopen("/home/log/debug_log.txt", "w", fp_dbglog);
    }
}

该代码大部分时间都可以工作,直到它不工作为止。 运行 申请几天后,我看到 debug_log.txt 增长超过 1 MB,而最后移动和重命名的日志文件是空的。

可能是什么原因?

使用 C 标准库中的 rename 函数(在 stdio.h 中)并检查 errno 如果它不知道失败的确切原因。

在处理文件时,I/O 通常,有很多很多事情可能会出错。

One of my senior developer in the company told me so. Is there anything wrong with using system()?

是:它是不必要的(C 和 POSIX 为您提供了这样的基本用法的功能),不可移植(假设您在具有“mv”的系统中) ,速度较慢(它需要产生另一个进程)并且在许多用例中都是错误的(例如,除非您保存 mv 的文本输出,否则无法知道到底是什么失败了)。

查看 Moving a file on Linux in C 之类的问题和答案以获得深入的解释。