Windows と C++ を使用して、大きなビデオ ファイル (長さが数ギガバイト) を取り、その最初と最後の数百メガバイトを「その場で」削除することが可能かどうかを知りたいです。
有用なデータを新しいファイルにコピーする従来のアプローチでは、一見不必要なコピーに 20 分以上かかることがよくあります。
これを実現するために、ディスクで低レベルで実行できる巧妙なものはありますか?
もちろん、理論上は可能です。ただし、ファイル システムが NTFS の場合は、更新する必要があるすべてのデータ構造について学習するために数か月を費やす準備をしてください。(これらはすべて正式に文書化されていません。)
また、次のいずれかを行う必要があります
ファイルシステムが FAT32 のような単純なものであれば、少し簡単です。要するに、それは可能かもしれませんが、たとえ可能であったとしても、あなたの人生には何年もかかるでしょう. 私のアドバイス:気にしないでください。
代わりに、問題を解決できる他の方法を検討してください。たとえば、avisynthスクリプトを使用して、関心のある領域からのフレームだけを提供します。
ディレクトリ エントリのセクタ アドレスをいじりたいだけですか? 計画がうまくいくとは、ほとんど考えられません。
まず第一に、削除するデータの量が正確にセクター サイズである必要があります。おそらく最初にいくつかのヘッダーデータが残っている必要があることを考えると、それはあまりありそうにありません。
これらの要件を満たしている場合でも、低レベルの変更が必要になるため、Windows はこれを阻止しようと懸命に努力します。
はい、NTFS でこれを行うことができます。
で外す端SetFileLength
。
ファイルの先頭、またはその他の大きな連続領域は、ゼロで上書きします。次に、ファイルを "sparse"とマークします。これにより、ファイル システムがそれらのクラスターを再利用できるようになります。
これは、ファイルの先頭に対するデータのオフセットを実際には変更しないことに注意してください。ファイルシステムが不要なデータを格納するスペースを浪費するのを防ぐだけです。
おそらく、ファイル形式でバイトを「スキップ」できるため、必要な部分を (つまり、メモリ マッピングを使用して) 単純に上書きできます。もちろん、これは依然として不必要に多くのディスク容量を使用します。
低レベルのファイルシステム操作が簡単だったとしても、動画ファイルの編集は単に不要なメガバイトを削除するだけの問題ではありません。圧縮、フレーム、オーディオとビデオの多重化、メディア ファイル コンテナー、その他多くの概念を考慮する必要があります。
あなたの最善の解決策は、アイドル状態の 20 分間を単純に受け入れることです。