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?

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


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


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


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

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



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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.