Byte [] Dizisi C # 'daki bir dosyaya yazılabilir mi?


345

Byte[]Bir dosyaya tam bir dosyayı temsil eden bir dizi yazmaya çalışıyorum .

İstemciden orijinal dosya TCP aracılığıyla gönderilir ve daha sonra bir sunucu tarafından alınır. Alınan akış bir bayt dizisine okunur ve daha sonra bu sınıf tarafından işlenmek üzere gönderilir.

Bu esas olarak, alıcının bir TCPClientsonraki akış için hazır olmasını sağlamak ve alıcı ucunu işlem ucundan ayırmak içindir.

FileStreamSınıf bağımsız değişken ya da (buna bayt yazmak için izin vermez) Başka bir Akış nesnesi olarak bir bayt dizisi almaz.

İşleme orijinal (TCPClient ile bir) farklı bir iş parçacığı tarafından yapmayı hedefliyoruz.

Bunu nasıl uygulayacağımı bilmiyorum, ne denemeliyim?

Yanıtlar:


728

Sorunun ilk cümlesine dayanarak: " Dosyaya tam bir dosyayı temsil eden bir Byte [] dizisi yazmaya çalışıyorum ."

En az direnç yolu:

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

Burada belgelenmiştir:

System.IO.File.WriteAllBytes - MSDN


40

Bir BinaryWriternesne kullanabilirsiniz .

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

Düzenleme: Hata, finallybölümü unuttum ... diyelim ki okuyucu için bir egzersiz olarak bırakılır ;-)


Diyelim ki sıkıştırılmış veri aldım ve Byte [] 'a açtım. Yukarıdaki işlevi kullanarak dosyayı geri oluşturmak mümkün mü? Herhangi bir öğretici veya demo çevrimiçi?
Cannon

@buffer_overflow: Orijinal dosyayı geri almak istiyorsanız önce sıkıştırmanız gerekir. Olası bir uygulama için Dekoratör
Desenine

2
BinaryWritertek kullanımlıktır, bu yüzden muhtemelen bir usingblok içinde kullanılmalıdır . Bu ayrıca, kaynak kodun atarken bazı temizleme işlemleri yaptığını gösterdiğinden, muhtemelen bazı ekstra çağrıları bırakabileceğiniz anlamına gelir .
Jeff B


11

Bunu, System.IO.BinaryWriterbir Akış gerektiren aşağıdakileri kullanarak yapabilirsiniz :

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

7
Sadece eklemek istiyorum, yazdıktan sonra bw.flush ve bw.close ekleyin
dekdev

6
@dekdev: çağırmadan hiçbir anlamı yoktur Flush()önce Close()olduğu gibi Close()floş olacaktır. Daha da iyisi, usingaynı zamanda flush'n'close bir madde kullanmaktır .
Tomas

1
Dispose'i kullanmayı unutmayın;
vitor_gaudencio_oliveira



1

BinaryReader'ı deneyin:

/// <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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.