C++ 交换文件内容的有效方法

C++ 交换文件内容的有效方法,c++,c,file,file-descriptor,C++,C,File,File Descriptor,我有N个文件。文件0,文件1…文件(n-1)。我的程序总是在这些文件上生成日志。我总是写文件0。如果文件0超过预定义的大小,则文件1将其内容传递给文件2,文件2传递给文件3…传递给文件(n-1),然后文件0将其内容传递给文件1。因此,日志基本上是按修改日期从文件0到文件(n-1)排序的。我的问题是如何有效地传递这些文件内容。每个文件大小可能为100MB。所以我无法深入复制它们 我的方法 我将销毁文件(n-1)。然后将文件(n-2)重命名为文件(n-1),将文件(n-3)重命名为文件(n-2),依

我有N个文件。文件0,文件1…文件(n-1)。我的程序总是在这些文件上生成日志。我总是写文件0。如果文件0超过预定义的大小,则文件1将其内容传递给文件2,文件2传递给文件3…传递给文件(n-1),然后文件0将其内容传递给文件1。因此,日志基本上是按修改日期从文件0到文件(n-1)排序的。我的问题是如何有效地传递这些文件内容。每个文件大小可能为100MB。所以我无法深入复制它们

我的方法

我将销毁文件(n-1)。然后将文件(n-2)重命名为文件(n-1),将文件(n-3)重命名为文件(n-2),依此类推,将文件0重命名为文件1。然后我将再次创建文件0并在其上写入

我的问题是我能否以某种方式交换文件指针或FD,这样就不需要重命名和销毁这些复杂的操作了?或者是否有其他更简单/有效的方式进行交换

我的问题是我能否以某种方式交换文件指针或FD,这样就不需要重命名和销毁这些复杂的操作了?或者是否有其他更简单/有效的方式进行交换

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

较长的答案是:取决于你想要什么

  • 是否希望文件0始终保持满状态并“溢出”到文件1中

    如果是这种情况,那么您需要保持所有文件打开,保持文件描述符静态,以便控制溢出,可能需要实现递归日志
    write
    函数(IMHO…不好玩)

    如果这是您的意图,那么是的,您肯定可以处理文件描述符,但无论何时写入日志文件,您都会受到严重的性能影响

  • 您是否希望文件0在满后“变成”文件1,比如将数据推送到后进先出的文件堆栈中,这样您就可以用一个空文件0重新开始

    如果是这样的话,因为数据在文件之间没有“流动”,所以保持所有文件的打开和浪费系统资源是没有意义的。仅在发生旋转时处理文件

    您可能还需要实现一个自定义的
    write
    函数来锁定和同步写入操作,以便在文件轮换生效时不会出现争用情况


祝你好运

为什么这么难呢?fileN不能是最新的日志并且fileN-1可以在历史记录中返回到file0吗?这更容易实现,并且节省了大量的复制/重命名/洗牌操作。为什么?填充文件0,然后转到文件1。填充后,将移至文件2。当你填写一个日志文件时,你只需要继续上升。这使得0是最古老的,N是最新的。如果你坚持你的技术,那么你将不得不进行一系列重命名操作。如果您创建了新文件,因此文件0是最旧的,文件N是最新的,那么您就不需要重命名。我会避免重命名。您不需要删除最后一个日志文件,只需在重命名所有其他文件时截断并重命名它即可。然后将其重命名为
file0
,看起来上面的许多评论员没有正确阅读您的问题。您的重命名解决方案似乎很好;我看没有理由改变它。它本质上就是logrotate所做的。