Byte []配列をC#のファイルに書き込むことはできますか?


344

Byte[]完全なファイルを表す配列をファイルに書き出そうとし ています。

クライアントからの元のファイルはTCPを介して送信され、サーバーによって受信されます。受信したストリームはバイト配列に読み込まれ、送信されてこのクラスで処理されます。

これは主に受信を確実にすることです TCPClientで次のストリームの準備ができと処理側を分離するためです。

FileStreamクラスは、バイト配列を引数として使用したり、別のStreamオブジェクトを使用したりしません(バイトオブジェクトをバイトオブジェクトに書き込むことができます)。

オリジナル(TCPClientを使用するスレッド)とは異なるスレッドで処理を実行することを目指しています。

これを実装する方法がわかりません。何を試したらいいですか?

回答:


728

質問の最初の文に基づいて、完全なファイル表す Byte []配列をファイルに書き出そうとしています。」

抵抗が最も少ない経路は次のとおりです。

File.WriteAllBytes(string path, byte[] bytes)

ここに文書化:

System.IO.File.WriteAllBytes -MSDN


40

BinaryWriterオブジェクトを使用できます。

protected bool SaveData(string FileName, byte[] Data)
{
    BinaryWriter Writer = null;
    string Name = @"C:\temp\yourfile.name";

    try
    {
        // Create a new stream to write to the file
        Writer = new BinaryWriter(File.OpenWrite(Name));

        // Writer raw data                
        Writer.Write(Data);
        Writer.Flush();
        Writer.Close();
    }
    catch 
    {
        //...
        return false;
    }

    return true;
}

編集:おっと、finallyパートを忘れました...読者の練習問題として残されているとしましょう;-)


圧縮データを受け取り、それをByte []に​​解凍したとしましょう。上記の関数を使用してファイルを作成し直すことはできますか?オンラインのチュートリアルやデモはありますか?
キャノン、

@buffer_overflow:元のファイルに戻したい場合は、最初に圧縮する必要があります。可能な実装については、Decoratorパターンを
ご覧ください

2
BinaryWriter使い捨てなので、おそらくusingブロック内で使用する必要があります。また、ソースコードは破棄中にクリーンアップを行うことが示されているため、追加の呼び出しの一部を省略できる可能性もあります。
ジェフB


11

System.IO.BinaryWriterこれは、Stream を使用して次のように実行できます。

var bw = new BinaryWriter(File.Open("path",FileMode.OpenOrCreate);
bw.Write(byteArray);

7
追加したいだけ、書き込み後bw.flushとbw.closeを追加します
dekdev

6
@dekdev:を呼び出すにはポイントがありませんFlush()Close()Close()フラッシュしますが。さらに良いのは、usingフラッシュとクローズを同時に行う句を使用することです。
トーマス

1
Disposeの使用を忘れないでください。
vitor_gaudencio_oliveira 2017年



1

BinaryReaderを試してください:

/// <summary>
/// Convert the Binary AnyFile to Byte[] format
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static byte[] ConvertANYFileToBytes(HttpPostedFileBase image)
{
    byte[] imageBytes = null;
    BinaryReader reader = new BinaryReader(image.InputStream);
    imageBytes = reader.ReadBytes((int)image.ContentLength);
    return imageBytes;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.