2008-12-19 13 views
264

Próbuję napisać tablicę Byte[] reprezentującą kompletny plik do pliku.Czy tablica bajtów [] może być zapisana w pliku w języku C#?

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

Ma to na celu zapewnienie, że odbierający TCPClient jest gotowy do następnego strumienia i oddziela odbierający koniec od końca przetwarzania.

Klasa FileStream nie pobiera tablicy bajtów jako argumentu lub innego obiektu Stream (co pozwala na zapisanie do niego bajtów).

Chcę, aby przetwarzanie zostało wykonane przez inny wątek niż oryginał (ten z TCPClient).

Nie wiem, jak to wdrożyć, co powinienem spróbować?

Odpowiedz

586

oparciu o zdanie pierwsze pytanie: „Staram się pisać byte [] array reprezentująca kompletny plik do pliku”

Droga najmniejszego oporu byłoby:

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

Udokumentowane tutaj:

System.IO.File.WriteAllBytes - MSDN

5

Tak, dlaczego nie?

fs.Write(myByteArray, 0, myByteArray.Length); 
33

Można użyć BinaryWriter obiekt.

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

Edit: Ups, zapomniałem finally część ... powiedzmy to pozostawiamy jako ćwiczenie dla czytelnika ;-)

+0

Powiedzmy, otrzymałem skompresowane dane, a ja rozpakowane go do byte []. Czy można ponownie utworzyć plik za pomocą powyższej funkcji? Każdy samouczek lub demo online? – Cannon

+0

@buffer_overflow: Najpierw musisz skompresować, jeśli chcesz odzyskać pierwotny plik.Spójrz na wzór dekoratora dla możliwej realizacji: http://en.wikipedia.org/wiki/Decorator_pattern – Treb

+0

Gotch Ya. Dzięki. – Cannon

9

Można to używając System.IO.BinaryWriter który pobiera strumień tak zrobić:

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

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

+4

@dekdev: Nie ma sensu wywoływać 'Flush()' przed 'Close()', ponieważ 'Close()' będzie wyładowane. Jeszcze lepiej jest użyć klauzuli 'using', która również będzie przepłukiwać i zamykać. – Tomas

+0

Nie zapomnij użyć utylizacji; –

15

jest statyczną metodą System.IO.File.WriteAllBytes

-2
public ActionResult Document(int id) 
    { 
     var obj = new CEATLMSEntities().LeaveDocuments.Where(c => c.Id == id).FirstOrDefault(); 
     string[] stringParts = obj.FName.Split(new char[] { '.' }); 
     string strType = stringParts[1]; 
     Response.Clear(); 
     Response.ClearContent(); 
     Response.ClearHeaders(); 
     Response.AddHeader("content-disposition", "attachment; filename=" + obj.FName); 
     var asciiCode = System.Text.Encoding.ASCII.GetString(obj.Document); 
     var datas = Convert.FromBase64String(asciiCode.Substring(asciiCode.IndexOf(',') + 1)); 
     //Set the content type as file extension type 
     Response.ContentType = strType; 
     //Write the file content 
     this.Response.BinaryWrite(datas); 
     this.Response.End(); 
     return new FileStreamResult(Response.OutputStream, obj.FType); 
    } 
+0

należy rozważyć dodanie fragmentu kodu do wyjaśnień :-) – kleopatra

+0

Możesz poprawić odpowiedź, dodając do niej jakiś opis. – Alexey

+0

To wygląda jak fragment kodu ASP.Net? Przyznaje, że konwertuje tekst na tablicę bajtów, a następnie zapisuje ją w strumieniu. Tak naprawdę nie odpowiada na moje oryginalne pytanie. –

0

Spró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; 
} 
Powiązane problemy