2009-04-11 7 views
3

WindowsとC++を使用して大きなビデオファイル(数ギガバイトの長さ)を取り込み、最初と最後の数百メガバイトを「インプレース」で削除することが可能かどうかを知りたいと思います。大きなファイルの両端をコピーせずに削除することはできますか?

有用なデータを新しいファイルにコピーする伝統的なアプローチでは、一見不要なコピーが20分以上かかることがよくあります。

これを実現するためにディスクを低レベルで実行できることはありますか?

答えて

6

もちろん、理論上可能です。しかし、あなたのファイルシステムがNTFSの場合は、に数ヶ月を費やすようにしてください。は、更新が必要なすべてのデータ構造について学習しています。 (すべては、その正式ところで文書化されていない。)

また、あなたはどちらか

  1. はどういうわけか、ボリュームをアンマウントしてから、変更を加える必要があります。または
  2. カーネルファイルシステムドライバを書く方法、MSからライセンスを購入する方法、ドライバを開発してライブファイルシステムを変更する方法を学びます。

あなたのファイルシステムがFAT32のような単純なものであれば少し楽です。しかしいずれにしても、短くてもかもしれません。でも可能ですが、それがあなたの人生から数年かかるでしょう。私のアドバイス:気にしないでください。

代わりに他の方法で問題を解決できますか?:例: avisynthスクリプトを使用して、関心のある領域のフレームだけを提供することができます。

+1

>正式に文書化されていない 申し訳ありません。 http://technet.microsoft.com/en-us/library/cc781134.aspx – Mark

+0

...ファイルシステムがFAT32の場合、ファイルは4 GB以下になります。 :) – bk1e

+0

@マーク:あなたは正しいかもしれません - 2006年ごろ、私が信頼できるLinux NTFSドライバを探していたときに思い出しました。利用可能なドライバの作成者は、仕様の詳細がリリースされました。 Wikipediaにはほとんど同じことが言われています(もちろん古いかもしれませんが):http://en.wikipedia.org/wiki/NTFS#Interoperability。 –

4

ディレクトリエントリ内のセクタアドレスを使って驚くばかりですか?計画が機能することは事実上考えられません。

まず、削除したいデータの量を正確にセクタサイズにする必要があります。それはおそらく、そこに残っていなければならない最初のヘッダーデータがある可能性を考慮している可能性は低いです。

これらの要件を満たしていても、Windowsは低レベルの変更を行います.Windowsはこれを防ぐために非常に努力します。

+0

"ディレクトリエントリ内のセクタアドレスを使って驚いていますか?" 実際には、yes :) 私はそれが可能であるかどうかを知るために十分なディスクを知りませんが、ここに投稿してください。 –

2

ファイルフォーマットでは、バイトをスキップすることができるため、必要な部分を簡単に書き込むことができます。これはもちろん、不必要に多くのディスクスペースを使い果たします。

1

低レベルのファイルシステム操作が簡単だったとしても、ビデオファイルを編集するだけでは、不要なメガバイトを削除するだけではありません。圧縮、フレーム、オーディオとビデオのマルチプレクシング、メディアファイルコンテナなど多くのコンセプトを考慮する必要があります...

あなたの最善の解決策は、アイドル状態の20分を受け入れることです。

2

はい、これはNTFS上で行うことができます。

最後に削除するのはSetFileLengthです。

ファイルの先頭または他の大きな連続領域は、ゼロで上書きされます。 mark the file "sparse"を使用すると、ファイルシステムはそれらのクラスタを再利用できます。

これは実際にファイルの先頭からのデータのオフセットを変更するものではなく、ファイルシステムが不要なデータを格納するスペースを無駄にしないようにすることに注意してください。

関連する問題