374 votes

Peut-on écrire un tableau de Byte[] dans un fichier en C# ?

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

Le fichier original du client est envoyé via TCP et ensuite 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 le destinataire TCPClient est prêt pour le flux suivant et sépare l'extrémité de réception de l'extrémité de traitement.

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

Je souhaite que le traitement soit effectué par un thread différent de l'original (celui avec le TCPClient).

Je ne sais pas comment mettre cela en œuvre, que dois-je essayer ?

774voto

Kev Points 60744

D'après la première phrase de la question : "J'essaie d'écrire un tableau de Byte[] représentant un dossier complet à un fichier."

Le chemin de moindre résistance serait :

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

Documenté ici :

System.IO.File.WriteAllBytes - MSDN

40voto

Treb Points 11153

Vous pouvez utiliser un BinaryWriter objet.

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é le finally partie... disons que c'est laissé comme un exercice pour le lecteur ;-)

0 votes

Disons que j'ai reçu des données compressées, et que je les ai décompressées en Byte[]. Est-il possible de recréer le fichier en utilisant la fonction ci-dessus ? Y a-t-il un tutoriel ou une démo en ligne ?

0 votes

@buffer_overflow : Vous devrez d'abord le compresser si vous voulez récupérer le fichier original. Jetez un œil au modèle de décorateur pour une mise en œuvre possible : fr.wikipedia.org/wiki/Decorator_pattern

2 votes

BinaryWriter est jetable et doit donc être utilisé dans le cadre d'un processus d'évaluation des risques. using bloc. Cela signifierait également que vous pourriez probablement laisser de côté certains des appels supplémentaires puisque l'option code source montre qu'il fait un peu de nettoyage pendant la mise au rebut.

21voto

Andrew Rollings Points 8361

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

12voto

JoshBerke Points 34238

Vous pouvez le faire en utilisant System.IO.BinaryWriter qui prend un Stream donc :

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

7 votes

Je veux juste ajouter, après l'écriture, bw.flush et bw.close.

6 votes

@dekdev : Il n'y a aucun intérêt à appeler Flush() avant Close() comme Close() va se rincer. Il est encore mieux d'utiliser un using qui va aussi flush'n'close.

1 votes

N'oubliez pas d'utiliser le bouton "Dispose" ;

9voto

Mitchel Sellers Points 38352

Vous pouvez utiliser le FileStream.Write(byte[] array, int offset, int count) pour l'écrire.

Si le nom de votre tableau est "mon tableau", le code serait le suivant.

myStream.Write(myArray, 0, myArray.count);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X