2017-07-25 51 views
0

我正在使用DotNetZip的GZipStream壓縮文件。我遇到的問題是生成的文件是空的。我嘗試沖洗/關閉流,但沒有結果。任何人都知道我做錯了什麼:GZipStream提供零字節文件

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

你確定你使用'await'是否正確?改爲嘗試同步的「CopyTo」。 – Luaan

+0

我剛剛嘗試過,但結果相同 –

+2

與這個問題無關,但是:您應該真正使用'Path.Combine'來構建複合路徑,而不是連接 –

回答

1

在這裏工作很好;你有一個完全可重複的例子,也許是基於這個?

結果:

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

代碼:

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

「DoTheThing」方法與我的完全相同。給我一個emtpy文件 –

+0

顯示的**確切代碼是否給你一個空文件?另外,如果您將調試信息添加到「DoTheThing」的開始和結尾,*是否會完成*?可能性:a)它正在拋出你正在吞嚥的異常(操作:添加一些錯誤處理,讓你看看是否是這種情況); b)你正在使用被阻塞的同步上下文,可能是代碼引發的死鎖(操作:查看*調用該方法的代碼以及它如何等待/等待) –

+1

它確實工作正常。另一個過程導致文件被重新創建 –