【问题标题】:Is it possible to delete both ends of a large file without copying?是否可以在不复制的情况下删除大文件的两端?
【发布时间】:2010-10-18 22:47:09
【问题描述】:

我想知道是否有可能使用 Windows 和 c++ 获取一个大型视频文件(长度为几 GB)并“就地”删除它的前几百兆字节和最后几百兆字节。

将有用数据复制到新文件的传统方法通常需要 20 分钟以上看似不必要的复制。

有没有什么巧妙的方法可以在磁盘的底层实现这一点?

【问题讨论】:

    标签: c windows file disk


    【解决方案1】:

    当然,理论上是可以的。但是,如果您的文件系统是 NTFS,请准备好花 几个月 了解您需要更新的所有数据结构。 (顺便说一句,所有这些都是官方无证的。)

    另外,您还需要

    1. 以某种方式卸载卷然后进行更改;或
    2. 了解如何编写内核文件系统驱动程序、从 MS 购买许可证、开发驱动程序并使用它来更改实时文件系统。

    如果您的文件系统是 FAT32 之类的更简单的文件系统,会更容易一些。但无论哪种方式:简而言之,它可能是可能的,但即使是这样,你的生命也会花费数年时间。我的建议:不要打扰。

    相反,看看可以解决问题的其他方法:例如通过使用avisynth 脚本仅提供来自您感兴趣的区域的帧。

    【讨论】:

    • > 官方无证顺便说一句对不起,什么? technet.microsoft.com/en-us/library/cc781134.aspx
    • ...如果您的文件系统是 FAT32,那么您的文件将是 4 GB 或更小。 :)
    • @Mark:你可能是对的——我记得在 2006 年左右,当我在寻找支持写作的免费且可靠的 Linux NTFS 驱动程序时,其中一个可用驱动程序的作者抱怨说规格细节没有公布。维基百科说的差不多(当然它可能已经过时了):en.wikipedia.org/wiki/NTFS#Interoperability.
    【解决方案2】:

    您是否希望只是在目录条目中摆弄扇区地址?几乎无法想象该计划会奏效。

    首先,它要求您要删除的数据量恰好是扇区大小。考虑到一开始可能有一些标题数据必须保留在那里,这不太可能。

    即使它满足这些要求,也需要进行低级修改,Windows 极力阻止您这样做。

    【讨论】:

    • "您是否希望只是在目录条目中摆弄扇区地址?"实际上,是的 :) 虽然我对磁盘的了解还不够,不知道这是否可能,因此在这里发帖。
    【解决方案3】:

    也许您的文件格式允许“跳过”字节,以便您可以简单地覆盖(即使用内存映射)必要的部分。当然,这仍然会占用不必要的大量磁盘空间。

    【讨论】:

      【解决方案4】:

      是的,您可以在 NTFS 上执行此操作。

      SetFileLength 删除的结尾。

      用零覆盖文件的开头或任何其他大的连续区域。然后mark the file "sparse",它允许文件系统回收这些集群。

      请注意,这实际上不会改变数据相对于文件开头的偏移量,它只会防止文件系统浪费空间来存储不需要的数据。

      【讨论】:

        【解决方案5】:

        即使低级文件系统操作很容易,编辑视频文件也不仅仅是删除不需要的兆字节。您仍然必须考虑诸如压缩、帧、音频和视频复用、媒体文件容器等许多其他概念......

        你最好的解决办法就是接受你空闲的二十分钟。

        【讨论】:

          猜你喜欢
          • 2015-04-25
          • 2013-06-20
          • 2021-10-11
          • 1970-01-01
          • 2018-09-03
          • 2020-02-28
          • 1970-01-01
          • 2017-04-26
          • 1970-01-01
          相关资源
          最近更新 更多