2011-07-28 18 views
29

すでに存在するファイル(C:\test.exe)にバイト配列を追加したいと思います。C#バイト配列を既存のファイルに追加する

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を使用して行うだろうが、私は巨大なバイト配列を使用しているつもりです、とSystem.MemoryOverload例外は常にスローされます。次のバイト配列を前提としています。だから、私はほとんどの場合、大きな配列を分割して各バイト配列をファイルの最後に追加する必要があります。

は、

エヴァン

+0

を行うための関数を作成することができます。 –

+0

私の主な目標は、2つの巨大なバイト配列を一緒に追加することです。ただし、例外(メモリ不足)がスローされるため、これは不可能です。だから私の解決策は、出力ファイルに別々にバイト配列を書き込むことです(ファイルを結合してファイルに書き込むのではなく)。 –

+0

少なくとも、あなたが試したコードを提供する必要があります...今のところ、あなたの問題の原因は不明です。すべてのStreamクラスとWriterクラスはバイト配列を直接書くことができます。 –

答えて

47

FileMode.Append作成モードでFileStreamを作成する方法もあります。

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

これは次のようになります。あなたはまた、内蔵のFileSystem.WriteAllBytes Method (String, Byte[], Boolean)を使用することができます

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); 
    } 
} 
+0

これは完全に働いた - ありがとう –

+1

これは完璧に見えます。他の回答にはBinaryWriterが使われています。なぜFileStreamメソッドでこれを選択するのでしょうか?私はそれがまったく同じ機能を果たしていると推測していますが、より多くのコード行が必要です。 – radsdau

+1

フラッシュする必要がありますか? –

3

をありがとう私は質問が何であるかを正確にわからないんだけど、C#がbyte配列をとるBinaryWriter方法があります。すべてのデータが添付されており、GetData()が添付されるデータの配列を返すときwriteFinishedが真

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; 
} 

6
  1. FileStreamを新規作成します。
  2. Seek()最後まで。
  3. Write()バイト。
  4. Close()ストリーム。
+0

これは私の問題に対する最良の解決策であるようです。私はそれを行って、あなたに知らせるでしょう。ありがとう –

5

を。

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

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

+1

私の知る限り、これはVB.Netの唯一の解決策です。 {}を使用しているhttps://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.filesystem.writeallbytes(v=vs.110).aspx –

0

あなたは単に私が問題を理解していないこの

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(); 
    } 
} 
+1

は 'FS.Close();'を呼び出す必要はありません。 – GSP