【发布时间】:2010-10-18 22:47:09
【问题描述】:
我想知道是否有可能使用 Windows 和 c++ 获取一个大型视频文件(长度为几 GB)并“就地”删除它的前几百兆字节和最后几百兆字节。
将有用数据复制到新文件的传统方法通常需要 20 分钟以上看似不必要的复制。
有没有什么巧妙的方法可以在磁盘的底层实现这一点?
【问题讨论】:
我想知道是否有可能使用 Windows 和 c++ 获取一个大型视频文件(长度为几 GB)并“就地”删除它的前几百兆字节和最后几百兆字节。
将有用数据复制到新文件的传统方法通常需要 20 分钟以上看似不必要的复制。
有没有什么巧妙的方法可以在磁盘的底层实现这一点?
【问题讨论】:
当然,理论上是可以的。但是,如果您的文件系统是 NTFS,请准备好花 几个月 了解您需要更新的所有数据结构。 (顺便说一句,所有这些都是官方无证的。)
另外,您还需要
如果您的文件系统是 FAT32 之类的更简单的文件系统,会更容易一些。但无论哪种方式:简而言之,它可能是可能的,但即使是这样,你的生命也会花费数年时间。我的建议:不要打扰。
相反,看看可以解决问题的其他方法:例如通过使用avisynth 脚本仅提供来自您感兴趣的区域的帧。
【讨论】:
您是否希望只是在目录条目中摆弄扇区地址?几乎无法想象该计划会奏效。
首先,它要求您要删除的数据量恰好是扇区大小。考虑到一开始可能有一些标题数据必须保留在那里,这不太可能。
即使它满足这些要求,也需要进行低级修改,Windows 极力阻止您这样做。
【讨论】:
也许您的文件格式允许“跳过”字节,以便您可以简单地覆盖(即使用内存映射)必要的部分。当然,这仍然会占用不必要的大量磁盘空间。
【讨论】:
是的,您可以在 NTFS 上执行此操作。
用SetFileLength 删除的结尾。
用零覆盖文件的开头或任何其他大的连续区域。然后mark the file "sparse",它允许文件系统回收这些集群。
请注意,这实际上不会改变数据相对于文件开头的偏移量,它只会防止文件系统浪费空间来存储不需要的数据。
【讨论】:
即使低级文件系统操作很容易,编辑视频文件也不仅仅是删除不需要的兆字节。您仍然必须考虑诸如压缩、帧、音频和视频复用、媒体文件容器等许多其他概念......
你最好的解决办法就是接受你空闲的二十分钟。
【讨论】: