2008-12-03 203 views
1

我使用SharpZipLib的開源.NET庫我的目標是要解壓縮XML文件,讀入的數據集。但是,在將文件讀入數據集時出現以下錯誤:「根級數據無效,第1行,第1位。」 我相信發生了什麼是解壓縮代碼不釋放該文件的原因如下。從<a href="http://www.icsharpcode.net" rel="nofollow noreferrer">www.icsharpcode.net</a></p> <p>解壓文件錯誤

1.)如果我解壓縮文件並退出應用程序。當我重新啓動應用程序時,我可以將解壓縮後的文件讀入數據集。 2.)如果我在寫入xml文件後立即讀取(不壓縮),那麼它工作正常。
3.)如果我將數據集寫入xml,將其壓縮,解壓縮,然後嘗試將其讀回來,我得到異常。

下面的代碼非常簡單。 UnZipFile將返回剛解壓縮的文件的名稱。在該調用的正下方是將其讀入數據集的調用。變量fileToRead是新解壓縮的xml文件的完整路徑。

string fileToRead = UnZipFile(filepath, DOViewerUploadStoreArea); 
ds.ReadXml(fileToRead) 

private string UnZipFile(string file, string dirToUnzipTo) 
{ 

     string unzippedfile = ""; 

     try 
     { 
      ZipInputStream s = new ZipInputStream(File.OpenRead(file)); 
      ZipEntry myEntry; 
      string tmpEntry = String.Empty; 
      while ((myEntry = s.GetNextEntry()) != null) 
      { 
       string directoryName = dirToUnzipTo; 
       string fileName = Path.GetFileName(myEntry.Name); 
       string fileWDir = directoryName + fileName; 
       unzippedfile = fileWDir; 

       FileStream streamWriter = File.Create(fileWDir); 
       int size = 4096; 
       byte[] data = new byte[4096]; 
       while (true) 
       { 
        size = s.Read(data, 0, data.Length); 
        if (size > 0) { streamWriter.Write(data, 0, size); } 
        else { break; } 
       } 
       streamWriter.Close(); 
      } 
      s.Close(); 
     } 
     catch (Exception ex) 
     { 
      LogStatus.WriteErrorLog(ex, "ERROR", "DOViewer.UnZipFile"); 

     } 
     return (unzippedfile); 
    } 

回答

1

那麼,最終文件是什麼樣子? (與原來相比)。您不會顯示壓縮代碼,這可能是難題的一部分,特別是當您部分吞下異常時。

我也會嘗試確保一切IDisposableDispose() d,理想情況下通過using;另外 - 如果問題與路徑建設有關,請使用Path.Combine。並且請注意,如果myEntry.Name包含子目錄,則需要手動創建它們。

這裏是我的 - 它適用於解壓縮ICSharpCode.SharpZipLib.dll:

private string UnZipFile(string file, string dirToUnzipTo) 
    { 

     string unzippedfile = ""; 

     try 
     { 
      using(Stream inStream = File.OpenRead(file)) 
      using (ZipInputStream s = new ZipInputStream(inStream)) 
      { 
       ZipEntry myEntry; 
       byte[] data = new byte[4096]; 
       while ((myEntry = s.GetNextEntry()) != null) 
       { 
        string fileWDir = Path.Combine(dirToUnzipTo, myEntry.Name); 
        string dir = Path.GetDirectoryName(fileWDir); 
        // note only supports a single level of sub-directories... 
        if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); 
        unzippedfile = fileWDir; // note; returns last file if multiple 

        using (FileStream outStream = File.Create(fileWDir)) 
        { 
         int size; 
         while ((size = s.Read(data, 0, data.Length)) > 0) 
         { 
          outStream.Write(data, 0, size); 
         } 
         outStream.Close(); 
        } 
       } 
       s.Close(); 
      } 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 

     } 
     return (unzippedfile); 
    } 

它也可能是這個問題是無論是在寫入的拉鍊,或讀取生成的代碼的代碼文件。

0

我比較了最初使用TextPad的原稿和它們是相同的。 另外我重寫了代碼以利用該使用。這是代碼。 我的問題似乎是圍繞文件鎖定或什麼的。如果我解壓文件退出應用程序,然後啓動它會讀取查找。

private string UnZipFile(string file, string dirToUnzipTo) 
    { 
     string unzippedfile = ""; 

     try 
     { 
      using (ZipInputStream s = new ZipInputStream(File.OpenRead(file))) 
      { 

       ZipEntry theEntry; 
       while ((theEntry = s.GetNextEntry()) != null) 
       { 
        string directoryName = dirToUnzipTo; 
        string fileName = Path.GetFileName(theEntry.Name); 
        string fileWDir = directoryName + fileName; 
        unzippedfile = fileWDir; 

        if (fileName != String.Empty) 
        { 
         using (FileStream streamWriter = File.Create(fileWDir)) 
         { 
          int size = 2048; 
          byte[] data = new byte[2048]; 
          while (true) 
          { 
           size = s.Read(data, 0, data.Length); 
           if (size > 0) 
           { 
            streamWriter.Write(data, 0, size); 
           } 
           else 
           { 
            break; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      LogStatus.WriteErrorLog(ex, "ERROR", "DOViewer.UnZipFile"); 

     } 
     return (unzippedfile); 
    } 
0

這對DotNetZip來說很簡單。

using (ZipFile zip = ZipFile.Read(ExistingZipFile)) 
{ 
    zip.ExtractAll(TargetDirectory);  
} 

如果要決定哪些文件提取....

using (ZipFile zip = ZipFile.Read(ExistingZipFile)) 
{ 
    foreach (ZipEntry e in zip) 
    { 
     if (wantThisFile(e.FileName)) e.Extract(TargetDirectory); 
    } 
} 

如果你想提取過程中覆蓋現有文件:

using (ZipFile zip = ZipFile.Read(ExistingZipFile)) 
{ 
    zip.ExtractAll(TargetDirectory, ExtractExistingFileAction.OverwriteSilently); 
} 

或者,提取有密碼保護的條目:

using (ZipFile zip = ZipFile.Read(ExistingZipFile)) 
{ 
    zip.Password = "Shhhh, Very Secret!"; 
    zip.ExtractAll(TargetDirectory, ExtractExistingFileAction.OverwriteSilently); 
} 
相關問題