2017-03-14 37 views
0

複数のエントリを持つzipファイルを作成できません。私はthis同様の質問への答えを見てきましたが、それでも喜びはありません。次のように私のコードは次のとおりです。複数のエントリを持つZipファイルを作成する

var folders = await _folderManager.GetDescendentsAsync(id); 

using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    // Build the archive 
    using (ZipArchive zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
    { 
     foreach (var folder in folders) 
     { 
      //get the path 
      var path = GetPath(folder); 

      foreach (var file in folder.Documents) 
      { 
       //get the file stream from storage 
       var docStream = _documentManager.DownloadById(file.Id); 

       //create an entry in the zip 
       ZipArchiveEntry archiveEntry = zipArchive.CreateEntry(path + file.Name); 
       using (var entryStream = archiveEntry.Open()) 
       { 
        await docStream.CopyToAsync(entryStream); 
       } 
      } 
     } 

     using (var fileStream = new FileStream(@"C:\Temp\ZipFile.zip", FileMode.Create)) 
     { 
      memoryStream.Seek(0, SeekOrigin.Begin); 
      await memoryStream.CopyToAsync(fileStream); 
     } 
    } 
} 

私は複数のエントリを持つzipファイルを取得しますが、私はそれを開こうとすると、エラー「アーカイブの予期しない終了」を取得しています。

誰も私が間違ってやっているものを私に伝えることができますか?

+0

近い/フラッシュzipアーカイブ' CopyTo' – Lanorkin

+0

と*前*セーブ結果:この問題を解決するには、memoryStreamFlush缶やFlushAsync .com/questions/9469434/error-creation-zip-file-using-dotnetzip-unexpected-end-of-archive – TheLethalCoder

+0

ガー!今は分かりましたが、私は木の木を見ることができませんでした!私は文を使用してzipアーカイブ内のfileStreamにコピーしていました。 zipArchiveを破棄することで、私はファイルストリームにコピーすることができました。フラッシングは必要ありません。 – Orbit74

答えて

0

CopyToAsyncメソッドは、1つのストリームの内容を別のストリームの内容にチャンクでコピーします。ストリームの最後にチャンクがチャンクサイズよりも小さい場合は、必ずしも他のストリームにコピーされるとは限りません。ます。http:// stackoverflowのあなたは `memoryStream`は、ここを参照してくださいをフラッシュする必要があるかもしれません

using (var fileStream = new FileStream(@"C:\Temp\ZipFile.zip", FileMode.Create)) 
{ 
    memoryStream.Seek(0, SeekOrigin.Begin); 
    await memoryStream.CopyToAsync(fileStream); 

    await memoryStream.FlushAsync(); 
} 
+0

まだ運がない私は恐れています。私はまた、 "await docStream.CopyToAsync(entryStream);"の後にentryStreamをフラッシュしようとしました。 :-( – Orbit74

+0

@ Orbit74ああ、あなたもそこにコピーしているのを見たことがありませんでした。あなたは 'CopyToAsync'コールの後に' docStream'をフラッシュしようとしましたか? – TheLethalCoder

+0

申し訳ありませんが、私はdocStreamを意味しました。 – Orbit74

関連する問題