是否可以删除大文件的两端而不复制?

时间:2009-04-11 20:09:00

标签: c windows file disk

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

将有用数据复制到新文件的传统方法通常需要花费大约20分钟的时间进行复制。

有没有什么聪明可以用磁盘做低级别来实现这一点?

5 个答案:

答案 0 :(得分:6)

当然,从理论上说这是可能的。但是,如果您的文件系统是NTFS,请准备好花几个月了解您需要更新的所有数据结构。 (所有这些都是正式无证件的BTW。)

此外,您还需要

  1. 然后以某种方式卸载音量并进行更改;或
  2. 了解如何编写内核文件系统驱动程序,从MS购买许可证,开发驱动程序并使用它来更改实时文件系统。
  3. 如果你的文件系统比FAT32更简单,那就容易多了。但无论哪种方式:简而言之,可能是可能的,但即使这样,你的生命也需要数年时间。我的建议:不要打扰。

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

答案 1 :(得分:4)

您是否希望在目录条目中摆弄扇区地址?计划可行,这几乎是不可思议的。

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

即使它满足了这些要求,也需要进行低级修改,Windows会非常努力地阻止您这样做。

答案 2 :(得分:2)

也许你的文件格式允许'跳过'字节,这样你就可以简单地写过(即用内存映射)必要的部分。这当然会耗尽不必要的磁盘空间。

答案 3 :(得分:2)

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

您使用SetFileLength删除的结尾。

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

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

答案 4 :(得分:1)

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

您最好的解决方案就是接受闲置20分钟。