ファイルの先頭にバイトを追加するための最も速くて効率的な方法は何ですか?基本的には、ファイルを開いてからバイト数を追加したいと思います。ループを使うことを考えましたが、先頭に付けるバイトがすべて同じであることを考えると、それは必要ないと思います。
4 に答える
ファイルに対してアトミックではない1つのアプローチ(つまり、プログラムが途中で停止した場合、データは一貫性のない状態のままになる可能性があります):
- ファイルを開きます。
- 最後から始めて、追加のサイズ差だけバイトを後方に移動します。これは
ReadBytes
、一度に1バイトではなく、ブロック(たとえば)で実行する必要があります。例については、ストリーム間でコピーするための最良の方法を参照してください。 - ファイルの先頭に新しいデータを入力します。
ただし、このアプローチでは、ファイルシステムの先読みスキームが混乱する可能性があり、シーク/ランダムなファイルアクセスが必要になります。これらの問題があるため、デバイスのスペースが絶対的なプレミアムである場合にのみ、正直に推奨できます。
ファイルに対してアトミックな別のアプローチ(プログラムがいずれかのステージで停止した場合、データが失われることはなく、プロセスを回復できます):
- 古いファイルを開きます。
- 新しいファイルを作成します。
- 新しいファイルにデータを入力します。
- 古いファイルから新しいファイルにデータを移動します(もう一度
ReadBytes
)-この場合、以前にリンクされたSOの質問は「そのまま機能する」はずです。 - 古いファイルを削除し、新しいファイルの名前を古いファイルに変更します。
「欠点」は、一時ファイルが必要になることです。
ハッピーコーディング。
本当に先頭に追加する必要がある場合、最も「安全な」方法は通常、バイトを新しいファイルに書き込み、この新しいファイルに古いファイルを書き込み、最後にファイルを交換することです(たとえばFile.Replace
、destinationBackupFileNameとしてnullを使用します)。 。古いファイルをコピーするのに十分なスペースが必要になることに注意してください。
これは私が個人的に考えることができる最も簡潔な方法ですが、あなたが望むようなループを避けません:
int numberOfBytes = 100;
byte newByte = 0x1;
using ( var newFile = new FileStream( @"C:\newfile.dat", FileMode.CreateNew, FileAccess.Write ) )
{
for ( var i = 0; i < numberOfBytes; i++ )
{
newFile.WriteByte( newByte );
}
using ( var oldFile = new FileStream( @"C:\oldfile.dat", FileMode.Open, FileAccess.Read ) )
{
oldFile.CopyTo(newFile);
}
}
// Rename and delete files, or whatever you want to do
エラー処理を使用することもできますが、理解できます。
私が考える最も簡単な方法は、バイト配列を作成し、「追加」バイトを追加してから、使用するファイルを別のバイト配列に変換して、それらをマージすることです。