2009-04-09 9 views
17

Mon client TCP reçoit une image dans un paquet. L'image est compressée avec zlib. La tâche consiste à décompresser l'image et à la placer sur le formulaire.Enregistrer le fichier à partir d'un octet [] dans C# NET 3.5

Je prévois de sauvegarder l'image compressée dans le répertoire courant, de la décompresser et de charger le fichier décompressé sur le formulaire.

Le premier problème vient avec l'enregistrement du fichier (compressé). Le zlib peut l'enregistrer décompressé.

Le code ci-dessous charge le fichier compressé et l'enregistre après la décompression. Comment faire passer le tableau byte [] directement à cette fonction?

private void decompressFile(string inFile, string outFile) 
    { 
     System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); 
     zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream); 
     System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);   
     try 
     { 
      CopyStream(inFileStream, outZStream); 
     } 
     finally 
     { 
      outZStream.Close(); 
      outFileStream.Close(); 
      inFileStream.Close(); 
     } 
    } 

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output) 
    { 
     byte[] buffer = new byte[2000]; 
     int len; 
     while ((len = input.Read(buffer, 0, 2000)) > 0) 
     { 
      output.Write(buffer, 0, len); 
     } 
     output.Flush(); 
    } 

Comment passer le tableau byte [] directement à cette fonction? Je prévois de l'enregistrer en tant que compressé, puis appeler la fonction avec l'emplacement du fichier compressé, mais je ne sais pas comment enregistrer un fichier à partir d'un tableau byte [] ni un moyen de passer l'octet [] tableau en tant que fichier d'entrée.

Toute aide sera grandement appréciée.

Merci.

+0

je ne comprenais pas que l'endroit où vous voulez passer l'octet [] pour? à la fonction CopyStream? –

+0

Également dans while ((len = input.Read (buffer, 0, 2000))> 0) { output.Write (buffer, 0, len); } N'avez-vous pas à réajuster l'emplacement auquel vous voulez écrire le tampon? il écraserait de l'emplacement 0 toujours. –

+1

En ce qui concerne la fonction CopyStream, c'est correct. Vous voulez toujours écrire à l'emplacement 0. Les paramètres supplémentaires déterminent l'emplacement de la copie dans le tampon. Mais nous copions toujours à partir de l'emplacement 0 dans le tampon à chaque fois dans la boucle. Par conséquent, nous voulons toujours écrire en sortie à partir de l'emplacement 0 dans le tampon. – Yuliy

Répondre

79

Utilisez la méthode statique void System.IO.File.WriteAllBytes (chemin de chaîne, octet [] bytes).

byte[] buffer = new byte[200]; 
File.WriteAllBytes(@"c:\data.dmp", buffer); 
+3

vous avez oublié d'échapper à vos personnages;). paramètre devrait être @ "c: \ data.dmp" ou "c: \\ data.dmp" –

+0

qu'en est-il de l'encodage ?? pour l'exemple, lisez un fichier (ANSI, UTF-8) à bytearray, puis écrivez le nouveau nom de fichier – Kiquenet

+3

Wow. Pourquoi est-ce que ça ne peut pas toujours être aussi simple? +1 – cbmeeks

1

Collez le tableau d'octets que vous avez reçu dans un MemoryStream et compressez/décompressez-le à la volée sans utiliser de fichiers temporaires.

5
public static void SaveFile(this Byte[] fileBytes, string fileName) 
{ 
    FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite); 
    fileStream.Write(fileBytes, 0, fileBytes.Length); 
    fileStream.Close(); 
} 
0

Vous pouvez essayer ce code

private void t1() 
    { 
     FileStream f1 = new FileStream("C:\\myfile1.txt", FileMode.Open); 
     int length = Convert.ToInt16(f1.Length); 
     Byte[] b1 = new Byte[length]; 
     f1.Read(b1, 0, length); 
     File.WriteAllBytes("C:\\myfile.txt",b1); 
     f1.Dispose(); 
    } 
+0

Vous oubliez de disposer du FileStream. – Noldorin

+2

Anirudh, s'habituer à utiliser une instruction 'using' à la place. référez-vous à la réponse d'Erich, ci-dessus. –

3

En plus de ce que tout le monde a déjà dit, je vous suggère également d'utiliser des clauses « utilisant » puisque tous ces objets implémentent IDisposable.

using(FileStream outFileStream = new ...) 
using(ZOutputStream outZStream = new ...) 
using(FileStream inFileStream = new ...) 
{ 
    CopyStream(inFileStream, outZStream); 
}