Czy tablicę Byte [] można zapisać do pliku w języku C #?


344

Próbuję napisać Byte[]tablicę reprezentującą pełny plik do pliku.

Oryginalny plik od klienta jest wysyłany przez TCP, a następnie odbierany przez serwer. Odebrany strumień jest odczytywany do tablicy bajtów, a następnie wysyłany do przetworzenia przez tę klasę.

Ma to głównie na celu zapewnienie, że odbieranie TCPClientjest gotowe do następnego strumienia i oddzielenie końca odbierającego od końca przetwarzania.

FileStreamKlasa nie bierze tablicę bajtów jako argument lub innego obiektu Stream (która nie pozwala pisać bajtów do niego).

Mam zamiar wykonać przetwarzanie za pomocą innego wątku niż oryginalny (ten z klientem TCPClient).

Nie wiem jak to zaimplementować, co powinienem spróbować?

Odpowiedzi:


728

Na podstawie pierwszego zdania pytania: „Próbuję napisać tablicę Byte [] reprezentującą pełny plik do pliku.”

Ścieżka najmniejszego oporu byłaby:

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

Udokumentowane tutaj:

System.IO.File.WriteAllBytes - MSDN


40

Możesz użyć BinaryWriterobiektu.

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

Edycja: Ups, zapomniałem finallyczęści ... powiedzmy, że została pozostawiona jako ćwiczenie dla czytelnika ;-)


Powiedzmy, że otrzymałem skompresowane dane i zdekompresowałem je do Byte []. Czy można ponownie utworzyć plik przy użyciu powyższej funkcji? Jakiś tutorial lub demo online?
Cannon

@buffer_overflow: Najpierw musisz go skompresować, jeśli chcesz odzyskać oryginalny plik. Spójrz na Wzorzec Dekoratora dla możliwej implementacji: en.wikipedia.org/wiki/Decorator_pattern
Treb

2
BinaryWriterjest jednorazowego użytku, więc prawdopodobnie powinien być używany w usingbloku. Oznaczałoby to również, że prawdopodobnie mógłbyś pominąć niektóre dodatkowe wywołania, ponieważ kod źródłowy pokazuje, że wykonuje pewne czyszczenie podczas usuwania.
Jeff B


11

Możesz to zrobić za System.IO.BinaryWriterpomocą strumienia, który:

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

7
Po prostu chcę dodać, po napisaniu dodaj bw.flush i bw.close
dekdev

6
@dekdev: Nie ma sensu dzwonić Flush()wcześniej, Close()ponieważ Close()będzie to kolor. Jeszcze lepiej jest użyć usingklauzuli, która również opróżni i zamknie.
Tomas

1
Nie zapomnij użyć Dispose;
vitor_gaudencio_oliveira



1

Wypróbuj 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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.