web-dev-qa-db-ja.com

C#既存のファイルにバイト配列を追加

既存のファイルにバイト配列を追加したい(C:\test.exe)。次のバイト配列を想定します。

byte[] appendMe = new byte[ 1000 ] ;

File.AppendAllBytes(@"C:\test.exe", appendMe); // Something like this - Yes, I know this method does not really exist.

File.WriteAllBytesを使用してこれを行いますが、ENORMOUSバイト配列を使用することになり、System.MemoryOverload例外が常にスローされます。そのため、大規模な配列を断片に分割し、各バイト配列をファイルの末尾に追加する必要があります。

ありがとうございました、

エヴァン

35
user725913

1つの方法は、 FileStreamFileMode.Append 作成モード。

ファイルが存在する場合はそれを開き、ファイルの最後までシークするか、新しいファイルを作成します。

これは次のようになります。

public static void AppendAllBytes(string path, byte[] bytes)
{
    //argument-checking here.

    using (var stream = new FileStream(path, FileMode.Append))
    {
        stream.Write(bytes, 0, bytes.Length);
    }
}
57
Ani
  1. 新しいFileStreamを作成します。
  2. Seek()を最後まで。
  3. Write()バイト。
  4. Close()ストリーム。
6
Mehrdad

組み込みのFileSystem.WriteAllBytes Method (String, Byte[], Boolean)を使用することもできます。

public static void WriteAllBytes(
    string file,
    byte[] data,
    bool append
)

AppendをTrueに設定して、ファイルの内容に追加します。 Falseファイルの内容を上書きします。デフォルトはFalseです。

5
Hamed

質問が何であるかは正確にはわかりませんが、C#にはバイト配列を受け取るBinaryWriterメソッドがあります。

BinaryWriter(Byte [])

_bool writeFinished = false;
string fileName = "C:\\test.exe";
FileStream fs = new FileString(fileName);
BinaryWriter bw = new BinaryWriter(fs);
int pos = fs.Length;
while(!writeFinished)
{
   byte[] data = GetData();
   bw.Write(data, pos, data.Length);
   pos += data.Length;
}
_

ここで、writeFinishedはすべてのデータが追加されたときにtrueになり、GetData()は追加されるデータの配列を返します。

3
user807566

これを行う関数を作成するだけです

public static void AppendToFile(string fileToWrite, byte[] DT)
{
    using (FileStream FS = new FileStream(fileToWrite, File.Exists(fileToWrite) ? FileMode.Append : FileMode.OpenOrCreate, FileAccess.Write)) {
        FS.Write(DT, 0, DT.Length);
        FS.Close();
    }
}
0
Jack Gajanan