Un tableau d'octets [] peut-il être écrit dans un fichier en C #?

344

J'essaie d'écrire un Byte[]tableau représentant un fichier complet dans un fichier.

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.

Il s'agit principalement de s'assurer que la réception TCPClientest prête pour le flux suivant et de séparer l'extrémité de réception de l'extrémité de traitement.

La FileStreamclasse ne prend pas un tableau d'octets comme argument ou autre objet Stream (ce qui vous permet d'y écrire des octets).

Je vise à obtenir le traitement effectué par un thread différent de l'original (celui avec le TCPClient).

Je ne sais pas comment implémenter cela, que dois-je essayer?

Roberto Bonini
la source

Réponses:

728

Basé sur la première phrase de la question: "J'essaie d'écrire un tableau d'octets [] représentant un fichier complet dans un fichier."

La voie de moindre résistance serait:

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

Documenté ici:

System.IO.File.WriteAllBytes - MSDN

Kev
la source
40

Vous pouvez utiliser un BinaryWriterobjet.

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: Oups, j'ai oublié la finallypartie ... disons qu'elle est laissée en exercice au lecteur ;-)

Treb
la source
Disons que j'ai reçu des données compressées et que je les ai décompressées en octets []. Est-il possible de recréer le fichier en utilisant la fonction ci-dessus? Un tutoriel ou une démo en ligne?
Cannon
@buffer_overflow: vous devrez d'abord le compresser si vous souhaitez récupérer le fichier d'origine. Jetez un œil au modèle de décorateur pour une implémentation possible: en.wikipedia.org/wiki/Decorator_pattern
Treb
2
BinaryWriterest jetable donc devrait probablement être utilisé dans un usingbloc. Cela signifierait également que vous pourriez probablement laisser de côté certains des appels supplémentaires, car le code source montre qu'il effectue un certain nettoyage lors de l'élimination.
Jeff B
20

Il existe une méthode statique System.IO.File.WriteAllBytes

Andrew Rollings
la source
11

Vous pouvez le faire en utilisant ce System.IO.BinaryWriterqui prend un Stream de la manière suivante:

var bw = new BinaryWriter(File.Open("path",FileMode.OpenOrCreate);
bw.Write(byteArray);
JoshBerke
la source
7
Je veux juste ajouter, après l'écriture, ajoutez bw.flush et bw.close
dekdev
6
@dekdev: Il ne sert à rien d'appeler Flush()avant Close()car cela Close()va vider. Encore mieux est d'utiliser une usingclause qui sera également flush'n'close.
Tomas
1
N'oubliez pas d'utiliser le Dispose;
vitor_gaudencio_oliveira
6

Oui, pourquoi pas?

fs.Write(myByteArray, 0, myByteArray.Length);
Mehrdad Afshari
la source
1

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;
}
PatsonLeaner
la source