我想知道是否有可能使用Windows和c ++来获取大型视频文件(长度为几千兆字节)并“就地”删除它的第一个和最后几百兆字节。
将有用数据复制到新文件的传统方法通常需要花费大约20分钟的时间进行复制。
有没有什么聪明可以用磁盘做低级别来实现这一点?
答案 0 :(得分:6)
当然,从理论上说这是可能的。但是,如果您的文件系统是NTFS,请准备好花几个月了解您需要更新的所有数据结构。 (所有这些都是正式无证件的BTW。)
此外,您还需要
如果你的文件系统比FAT32更简单,那就容易多了。但无论哪种方式:简而言之,可能是可能的,但即使这样,你的生命也需要数年时间。我的建议:不要打扰。
相反,查看可以解决问题的其他方法:例如通过使用avisynth脚本仅提供您感兴趣的区域中的帧。
答案 1 :(得分:4)
您是否希望在目录条目中摆弄扇区地址?计划可行,这几乎是不可思议的。
首先,它要求您要删除的数据量恰好是扇区大小。考虑到一开始可能有一些标题数据必须保留在那里,这不太可能。
即使它满足了这些要求,也需要进行低级修改,Windows会非常努力地阻止您这样做。
答案 2 :(得分:2)
也许你的文件格式允许'跳过'字节,这样你就可以简单地写过(即用内存映射)必要的部分。这当然会耗尽不必要的磁盘空间。
答案 3 :(得分:2)
是的,您可以在NTFS上执行此操作。
您使用SetFileLength
删除的结尾。
文件的开头或任何其他大的连续区域,用零覆盖。然后是mark the file "sparse",它允许文件系统回收这些集群。
请注意,这实际上不会改变数据相对于文件开头的偏移量,它只会阻止文件系统浪费存储不需要数据的空间。
答案 4 :(得分:1)
即使低级文件系统操作很简单,编辑视频文件也不仅仅是删除不需要的兆字节。您仍然必须考虑压缩,帧,音频和视频多路复用,媒体文件容器等许多其他概念......
您最好的解决方案就是接受闲置20分钟。