【问题标题】:Move or copy and truncate a file that is in use移动或复制和截断正在使用的文件
【发布时间】:2012-05-20 18:06:42
【问题描述】:

我希望能够(以编程方式)移动(或复制和截断)不断使用和写入的文件。这将导致写入的文件永远不会太大。

这可能吗? Windows 或 Linux 都可以。

具体来说,我正在尝试使用 FFMPEG 记录视频并创建长达一小时的视频。

【问题讨论】:

    标签: windows linux ffmpeg copy truncate


    【解决方案1】:

    在 Windows 和 Linux 中都可以,但需要相关应用程序之间的合作。如果将新数据写入文件的应用程序不知道其他应用程序在做什么,它可能无法工作(嗯......有一些可能性......稍后再回到那个)。

    一般来说,要使其正常工作,您必须打开共享文件。例如,如果使用 Windows API CreateFile,则两个应用程序都可能需要指定 FILE_SHARE_READFILE_SHARE_WRITE。这将允许两个(多个)应用程序“同时”读取和写入文件。

    不过,除了共享文件之外,还需要协调应用程序之间的操作。您将需要使用某种锁定机制(通过锁定文件的某些部分或某些共享互斥体/信号量)。请注意,如果您使用文件锁定,您可以锁定文件中的一些已知偏移量以充当“信号量”(它甚至可以是超出文件物理结尾的字节值)。如果一个应用程序在另一个应用程序截断文件的同时附加到文件,那么这将导致不可预知的结果。

    回到关于两个应用程序需要相互了解的评论......如果两个应用程序以独占方式打开文件并不断重试操作直到成功,则执行操作,然后关闭文件,它本质上将允许他们在没有彼此“知识”的情况下工作。但是,这可能效果不佳,效率也不是很高。

    说了这么多,出于效率原因,您可能需要考虑替代方案。例如,如果可以让写入应用程序定期写入新文件,那么它可能比必须不断地将数据从一个文件“移动”到另一个文件更有效。此外,如果您需要维护文件的某些部分(例如,将前 100 MB 移出到另一个文件,然后将第二个 100 MB 移到开头),这也可能是一项相当昂贵的操作。

    【讨论】:

      【解决方案2】:

      logrotate 是 linux 的一个不错的选择,几乎任何发行版都有库存。我确定某处有类似的 Windows 服务

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多