2017-07-25 6 views
0

J'utilise GZipStream de DotNetZip pour compresser un fichier. Le problème que j'ai est que le fichier résultant est vide. J'ai essayé de rincer/fermer les flux, mais sans résultat. Quelqu'un sait ce que je fais mal:GZipStream fournit un fichier zéro octet

using (var outputStream = new FileStream(path + fileName + ".gz", FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    using (var zipStream = new GZipStream(outputStream, CompressionMode.Compress)) 
    { 
     using (var inputStream = new FileStream(path + fileName, FileMode.Open, FileAccess.Read, FileShare.None)) 
     { 
      await inputStream.CopyToAsync(zipStream); 
     } 
    } 
} 
+0

Etes-vous sûr que vous utilisez 'await' correctement? Essayez le 'CopyTo' synchrone à la place. – Luaan

+0

Je viens de l'essayer, mais avec le même résultat –

+2

Sans rapport avec la question, mais: vous devriez vraiment utiliser 'Path.Combine' pour construire des chemins composites, pas de concaténation –

Répondre

1

Fonctionne bien ici; avez-vous un exemple entièrement reproductible, peut-être basé sur celui-ci?

Résultats:

dummy.txt:6492 bytes 
Waiting for completion (don't do this in real code, ever)... 
Complete 
dummy.txt.gz:512 bytes 

code:

using System; 
using System.IO; 
using System.IO.Compression; 
using System.Linq; 
using System.Threading.Tasks; 

static class P 
{ 
    static void Main() 
    { 

     File.WriteAllLines("dummy.txt", 
      Enumerable.Range(1, 200).Select(i => "this is some contents: line " + i)); 

     WriteSize("dummy.txt"); 

     var t = Task.Run(() => DoTheThing(Environment.CurrentDirectory + "\\", "dummy.txt")); 
     Console.WriteLine("Waiting for completion (don't do this in real code, ever)..."); 
     t.Wait(); 
     Console.WriteLine("Complete"); 
     WriteSize("dummy.txt.gz"); 
    } 

    private static void WriteSize(string path) 
    { 
     var file = new FileInfo(path); 
     Console.WriteLine(path + ":" + file.Length + " bytes"); 
    } 

    async static Task DoTheThing(string path, string fileName) 
    { 
     using (var outputStream = new FileStream(path + fileName + ".gz", FileMode.Create, FileAccess.Write, FileShare.None)) 
     { 
      using (var zipStream = new GZipStream(outputStream, CompressionMode.Compress)) 
      { 
       using (var inputStream = new FileStream(path + fileName, FileMode.Open, FileAccess.Read, FileShare.None)) 
       { 
        await inputStream.CopyToAsync(zipStream); 
       } 
      } 
     } 
    } 
} 
+0

La méthode "DoTheThing" est exactement comme je l'ai. Donne-moi un fichier emtpy –

+0

Est-ce que le ** code exact affiché ** vous donne un fichier vide? aussi, si vous ajoutez des informations de débogage au début et à la fin de 'DoTheThing', * est-il complet *? Possibilités: a) il lance une exception que vous avalez (action: ajoutez une gestion des erreurs qui vous permet de voir si c'est le cas); b) vous utilisez un contexte de synchronisation qui est bloqué, peut-être un blocage induit par le code (action: regardez le code qui * appelle * la méthode et comment elle est attendue/attendue) –

+1

Cela a bien fonctionné. Un autre processus entraînait la recréation du fichier –