【发布时间】:2016-06-27 18:54:02
【问题描述】:
我有 N 个文件。文件 0,文件 1...文件(n-1)。我的程序总是在这些文件上生成日志。我总是写到 File0。如果 File0 超过预定义的大小,则 File1 将其内容传递给 File2,并将 File2 传递给 File3...传递给 File(n-1),然后 File0 将其内容传递给 File1。所以基本上日志是按从 File0 到 File(n-1) 的修改日期排序的。我的问题是如何有效地传递这些文件内容。每个文件大小可能为 100MB。所以我不能深度复制它们。
我的方法
我将销毁文件(n-1)。然后将文件(n-2)重命名为文件(n-1)并将文件(n-3)重命名为文件(n-2),依此类推,将文件0重命名为文件1。然后我将再次创建 File0 并在上面写。
我的问题是我可以以某种方式交换文件指针或 fds,以便不需要重命名和销毁的所有这些复杂性吗?或者有没有其他更简单/有效的交换方式。
【问题讨论】:
-
为什么要这样做? fileN 不能是最新的日志并且 fileN-1 不能在历史记录中返回到 file0 吗?这更容易实现,并且节省了大量的复制/重命名/改组。
-
为什么?你填充file0,然后你移动到file1。一旦你填写你移动到file2。当您填写日志文件时,您只会继续上升。这使得 0 是最旧的,而 N 是当前的。
-
如果你坚持你的技术,那么你就会陷入一堆重命名操作。如果您创建新文件,因此文件 0 是最旧的,文件 N 是最新的,那么您无需重命名。我会避免重命名。
-
您不需要删除最后一个日志文件,只需将其截断并重命名,同时重命名所有其他文件。然后重命名为
file0 -
以上评论中的许多人似乎没有正确阅读您的问题。您的重命名解决方案似乎很好;我认为没有理由改变它。它本质上就是 logrotate 所做的。
标签: c++ c file file-descriptor