是否可以在不复制的情况下删除大文件的两端?
Posted
技术标签:
【中文标题】是否可以在不复制的情况下删除大文件的两端?【英文标题】:Is it possible to delete both ends of a large file without copying? 【发布时间】:2010-10-18 22:47:09 【问题描述】:我想知道是否有可能使用 Windows 和 c++ 获取一个大型视频文件(长度为几 GB)并“就地”删除它的前几百兆字节和最后几百兆字节。
将有用数据复制到新文件的传统方法通常需要 20 分钟以上看似不必要的复制。
有没有什么巧妙的方法可以在磁盘的底层实现这一点?
【问题讨论】:
【参考方案1】:当然,理论上是可以的。但是,如果您的文件系统是 NTFS,请准备好花 几个月 了解您需要更新的所有数据结构。 (顺便说一句,所有这些都是官方无证的。)
另外,您还需要
-
以某种方式卸载卷然后进行更改;或
了解如何编写内核文件系统驱动程序、从 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】:即使低级文件系统操作很容易,编辑视频文件也不仅仅是删除不需要的兆字节。您仍然必须考虑诸如压缩、帧、音频和视频复用、媒体文件容器等许多其他概念......
你最好的解决办法就是接受你空闲的二十分钟。
【讨论】:
以上是关于是否可以在不复制的情况下删除大文件的两端?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不运行 QEMU 的情况下将文件复制到 QEMU 映像?
是否可以在不创建全新文件的情况下修改 .jar 文件? [复制]