大きなファイルの両端をコピーせずに削除することはできますか?

StackOverflow https://stackoverflow.com/questions/740710

  •  09-09-2019
  •  | 
  •  

質問

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

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

これを実現するために、ディスクを低レベルで実行できる何か賢い方法はありますか?

役に立ちましたか?

解決

確かに、理論的には可能です。ただし、ファイルシステムが NTFS の場合は、出費を覚悟してください。 数ヶ月 更新する必要があるすべてのデータ構造について学びます。(ところで、これらはすべて公式には文書化されていません。)

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

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

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

その代わり、 問題を解決できる他の方法を検討する:例えばを使用して アヴィシンス スクリプトを使用して、関心のある領域のフレームのみを提供します。

他のヒント

あなただけのディレクトリエントリにセクタアドレスと周りいじることを期待していますか?これは、計画がうまくいくことを事実上考えられないのです。

まず第一に、それはあなたが削除するデータの量が正確にセクタサイズであることが必要となります。それは非常に可能性の高いいくつかのヘッダデータが残っている必要があります非常に開始時に、おそらくそこにあることを考慮しません。

それは、これらの要件メッツたとしても、それはWindowsがやってからあなたを防ぐことは非常に難しいしようとする低レベルの修正を、かかるだろう。

たぶんあなたのファイル形式を使用すると、単純に(すなわち、メモリマッピングで)必要な部品を上書きすることができるように、バイトを「スキップ」にできます。もちろん、これはまだ不必要なディスク容量を使用することになります。

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

最後はあなたがSetFileLengthで削除します。

、あなたはゼロで始まり、またはファイルの任意の他の大規模な連続した領域に上書きします。その後、ことができますファイル「スパース」に、マークこれらのクラスタを取り戻すために、ファイルシステムます。

これは実際にはファイルの先頭に関連するデータのオフセット、それだけで不要なデータを格納するスペースを無駄からファイルシステムを防ぎます。

を変更しないことに注意してください

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

などの概念を考慮しなければなりませんの

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top