2008-12-19 7 views
264

J'essaye d'écrire un tableau Byte[] représentant un fichier complet dans un fichier.Est-il possible d'écrire un tableau Byte [] dans un fichier en C#?

Le fichier d'origine du client est envoyé via TCP puis reçu par un serveur. Le flux reçu est lu dans un tableau d'octets, puis envoyé pour être traité par cette classe.

Ceci est principalement pour s'assurer que le TCPClient de réception est prêt pour le flux suivant et séparer l'extrémité de réception de la fin de traitement.

La classe FileStream ne prend pas un tableau d'octets en tant qu'argument ou autre objet Stream (ce qui vous permet d'écrire des octets).

Je vise à obtenir le traitement par un thread différent de l'original (celui avec TCPClient). Je ne sais pas comment implémenter ceci, que dois-je essayer?

Répondre

586

Sur la base de la première phrase de la question: « Je suis en train d'écrire un octet [] tableau représentant un dossier complet dans un fichier. »

Le chemin de moindre résistance serait:

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

décrites ici:

System.IO.File.WriteAllBytes - MSDN

5

Oui, pourquoi pas?

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

Vous pouvez utiliser un objet 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; 
} 

Edit: Oops, oublièrent finally partie ... permet de dire qu'il est laissé comme un exercice pour le lecteur ;-)

+0

Disons que, je l'ai reçu des données compressées, et je l'ai décompressé à Byte []. Est-il possible de créer le fichier en utilisant la fonction ci-dessus? Un tutoriel ou une démo en ligne? – Cannon

+0

@buffer_overflow: Vous devez d'abord le compresser si vous voulez récupérer le fichier d'origine.Jetez un oeil sur le modèle de décorateur pour une mise en œuvre possible: http://en.wikipedia.org/wiki/Decorator_pattern – Treb

+0

gotch ya. Merci. – Cannon

9

Vous pouvez le faire en utilisant System.IO.BinaryWriter qui prend un flux si:

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

Je veux juste ajouter, après écrire ajouter bw.flush et bw.close – dekdev

+4

@dekdev: Il ne sert à rien d'appeler 'Flush()' avant 'Close()' car 'Close()' videra. Encore mieux est d'utiliser une clause 'using' qui sera également flush'n'close. – Tomas

+0

Ne pas oublier d'utiliser le Dispose; –

15

Il existe une méthode statique 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

S'il vous plaît envisager d'ajouter un peu d'explication à l'extrait de code :-) – kleopatra

+0

Vous pouvez améliorer la réponse en ajoutant une description à elle. – Alexey

+0

Cela ressemble à un extrait ASP.Net? Certes, il convertit le texte en un tableau d'octets, puis l'écrit dans le flux. Ne répond pas vraiment à ma question initiale tho. –

0

Essayez 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; 
} 
Questions connexes