3

Windows と C++ を使用して、大きなビデオ ファイル (長さが数ギガバイト) を取り、その最初と最後の数百メガバイトを「その場で」削除することが可能かどうかを知りたいです。

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

これを実現するために、ディスクで低レベルで実行できる巧妙なものはありますか?

4

5 に答える 5

6

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

また、次のいずれかを行う必要があります

  1. 何らかの方法でボリュームをアンマウントし、変更を加えます。また
  2. カーネル ファイルシステム ドライバーを作成する方法、MS からライセンスを購入する方法、ドライバーを開発する方法、およびそれを使用してライブ ファイルシステムに変更を加える方法を学びます。

ファイルシステムが FAT32 のような単純なものであれば、少し簡単です。要するに、それは可能かもしれませんが、たとえ可能であったとしても、あなたの人生には何年もかかるでしょう. 私のアドバイス:気にしないでください。

代わりに、問題を解決できる他の方法を検討してください。たとえば、avisynthスクリプトを使用して、関心のある領域からのフレームだけを提供します。

于 2009-04-11T20:23:34.580 に答える
4

ディレクトリ エントリのセクタ アドレスをいじりたいだけですか? 計画がうまくいくとは、ほとんど考えられません。

まず第一に、削除するデータの量が正確にセクター サイズである必要があります。おそらく最初にいくつかのヘッダーデータが残っている必要があることを考えると、それはあまりありそうにありません。

これらの要件を満たしている場合でも、低レベルの変更が必要になるため、Windows はこれを阻止しようと懸命に努力します。

于 2009-04-11T20:17:52.520 に答える
2

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

で外す端SetFileLength

ファイルの先頭、またはその他の大きな連続領域は、ゼロで上書きします。次に、ファイルを "sparse"とマークします。これにより、ファイル システムがそれらのクラスターを再利用できるようになります。

これは、ファイルの先頭に対するデータのオフセットを実際には変更しないことに注意してください。ファイルシステムが不要なデータを格納するスペースを浪費するのを防ぐだけです。

于 2011-05-11T01:54:31.903 に答える
2

おそらく、ファイル形式でバイトを「スキップ」できるため、必要な部分を (つまり、メモリ マッピングを使用して) 単純に上書きできます。もちろん、これは依然として不必要に多くのディスク容量を使用します。

于 2009-04-11T20:32:45.900 に答える
1

低レベルのファイルシステム操作が簡単だったとしても、動画ファイルの編集は単に不要なメガバイトを削除するだけの問題ではありません。圧縮、フレーム、オーディオとビデオの多重化、メディア ファイル コンテナー、その他多くの概念を考慮する必要があります。

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

于 2009-04-11T20:41:47.953 に答える