2011-08-22 12 views
0

我得到這個錯誤,當我保存拉鍊多個文件「無法訪問已關閉的文件」。 這是代碼。錯誤在zip.Save(NewZipPath);無法訪問在ASP.Net一個封閉的文件(在保存壓縮文件的文件)

internal static string UpdateZipFile(string PdfPath, string ZipPath, 
        string NewZipPath, string docPath) 
{ 
    try 
    { 
    using (ZipFile zip = ZipFile.Read(ZipPath)) 
    { 
     FileStream fs = new FileStream(PdfPath, FileMode.Open, FileAccess.Read); 

     DirectoryInfo Dir = new DirectoryInfo(docPath); 

     FileInfo[] FileList = Dir.GetFiles("*.*", SearchOption.AllDirectories); 

     foreach (FileInfo FI in FileList) 
     { 
     zip.AddEntry(FI.FullName, fs); 
     } 

     // Error at this line if more than one 
     // files in above directory. 
     zip.Save(NewZipPath); 

     fs.Close(); 
     fs.Dispose(); 

     return "- ZIP Generated Successfully !"; 
    } 
    } 
    catch (Exception ex) 
    { 
    return ex.Message; 
    } 
} 

完全例外

System.ObjectDisposedException: Cannot access a closed file. 
    at System.IO.__Error.FileNotOpen() 
    at System.IO.FileStream.get_Length() 
    at Ionic.Zip.ZipEntry.SetInputAndFigureFileLength(Stream& input) 
    at Ionic.Zip.ZipEntry._WriteEntryData(Stream s) 
    at Ionic.Zip.ZipEntry._EmitOne(Stream outstream) 
    at Ionic.Zip.ZipEntry.Write(Stream s) 
    at Ionic.Zip.ZipFile.Save() 
    at Ionic.Zip.ZipFile.Save(String fileName) 
    at RideShare.Utility.UpdateZipFile(String PdfPath, 
String ZipPath, String NewZipPath, String docPath) in 

感謝。

+0

foreach循環?這[可能被固定在一個新的版本(http://dotnetzip.codeplex.com/workitem/10489)。 –

回答

0

exception是因爲AddEntry使用FileStram,它與FileStream完成後,它會自動關閉它..所以這是第一個文件後期間Save關閉......當有一個文件它是好的 - 但你的代碼爲每個文件添加相同的FileStream fs ...不知道這是你真正想要的...我想你會想要打開一個單獨的流,每個文件通過AddEntry ...

你的代碼更改爲:

foreach (FileInfo FI in FileList) 
    { 
    zip.AddFile(FI.FullName); 
    } 

或更換您正在使用什麼版本DotNetZip由

zip.AddFiles((from FI in Dir.GetFiles("*.*", SearchOption.AllDirectories) select FI.FullName).ToArray()); 
相關問題