交换文件内容的有效方式

时间:2016-06-27 18:54:03

标签: c++ c file file-descriptor

我有N个文件。 File0,File1 ...文件(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)重命名为File(n-2),依此类推,将File0重命名为File1。然后我将再次创建File0并在其上书写。

我的问题我可以以某种方式交换文件指针或fds,以便不需要重命名和销毁所有这些复杂性吗?或者是否有其他更简单/有效的方式进行交换。

1 个答案:

答案 0 :(得分:1)

  

我的问题我可以以某种方式交换文件指针或fds,以便不需要重命名和销毁所有这些复杂性吗?或者是否有其他更简单/有效的方式进行交换。

简短回答(虽然没有包含)是:不,这不会有效。

答案越长:取决于你想要的东西。

  • 您是否希望file0始终保持已满并“流入”到file1?

    如果是这种情况,那么你需要保持所有文件打开,保持文件描述符是静态的,这样你就可以控制溢出,可能实现递归日志write功能(恕我直言......不好玩)。

    如果这是你的意图,那么是的,你绝对可以玩弄文件描述符,但是当你写入日志文件时,你会得到很大的性能。

  • 你想让file0在变满之后“成为”file1,比如将数据推送到LIFO文件堆栈,这样你就可以用空文件0开始新鲜了吗?

    如果是这种情况,由于数据在文件之间没有“流动”,因此没有必要保持所有文件都打开并浪费系统资源。您只会在轮换发生时处理文件。

    您可能还需要实现一个自定义write函数来锁定和同步写入操作,因此在文件轮换生效时不会出现竞争条件。

祝你好运!