2013-04-05 50 views
4

這是我的問題,我試圖讓我的世界經典服務器,我使用文本系統,使每個地圖允許列表,問題是文本系統使文件每個地圖和我們總共獲得了15k個地圖,所以如果1k玩家將允許列表添加到他們的地圖中,則很難將服務器上傳/移動到其他主機。我想在我的軟件的主文件夾中創建一個zip文件,並將其添加到每個文本文件中,並使其可以與系統讀取,我想知道如何從GZip讀取文件,以及如何壓縮文件。C# - 如何從GZip讀取文本文件

謝謝

+0

這個C#代碼是如何與這個問題相關的?請僅留下相關代碼並通過僅引用實際代碼來制定您的問題 – sll 2013-04-05 09:24:51

回答

4

有關如何使用GZip進行壓縮和解壓縮的詳細信息。解壓縮後,您可以使用StreamReader() class來讀取文件(.NET 4.0)的內容。

using System; 
using System.IO; 
using System.IO.Compression; 

namespace zip 
{ 
    public class Program 
    { 
     public static void Main() 
     { 
      string directoryPath = @"c:\users\public\reports"; 

      DirectoryInfo directorySelected = new DirectoryInfo(directoryPath); 

      foreach (FileInfo fileToCompress in directorySelected.GetFiles()) 
      { 
       Compress(fileToCompress); 
      } 

      foreach (FileInfo fileToDecompress in directorySelected.GetFiles("*.gz")) 
      { 
       Decompress(fileToDecompress); 
      } 
     } 

     public static void Compress(FileInfo fileToCompress) 
     { 
      using (FileStream originalFileStream = fileToCompress.OpenRead()) 
      { 
       if ((File.GetAttributes(fileToCompress.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fileToCompress.Extension != ".gz") 
       { 
        using (FileStream compressedFileStream = File.Create(fileToCompress.FullName + ".gz")) 
        { 
         using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress)) 
         { 
          originalFileStream.CopyTo(compressionStream); 
          Console.WriteLine("Compressed {0} from {1} to {2} bytes.", 
           fileToCompress.Name, fileToCompress.Length.ToString(), compressedFileStream.Length.ToString()); 
         } 
        } 
       } 
      } 
     } 

     public static void Decompress(FileInfo fileToDecompress) 
     { 
      using (FileStream originalFileStream = fileToDecompress.OpenRead()) 
      { 
       string currentFileName = fileToDecompress.FullName; 
       string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length); 

       using (FileStream decompressedFileStream = File.Create(newFileName)) 
       { 
        using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress)) 
        { 
         decompressionStream.CopyTo(decompressedFileStream); 
         Console.WriteLine("Decompressed: {0}", fileToDecompress.Name); 
        } 
       } 
      } 
     } 
    } 
} 

Source

+0

以下是我的新問題:http://puu.sh/2uehO – 111WARLOCK111 2013-04-05 09:41:17

+0

@ user2248354您使用的是什麼版本的.NET? – Dave 2013-04-05 10:02:07

+0

Microsoft Visual Studio 2010 Professional – 111WARLOCK111 2013-04-05 10:27:43

6

如果你想避免創建臨時文件,您可以使用此:

using (Stream fileStream = File.OpenRead(filePath), 
       zippedStream = new GZipStream(fileStream, CompressionMode.Decompress)) 
{ 
    using (StreamReader reader = new StreamReader(zippedStream)) 
    { 
     // work with reader 
    } 
} 
7

這是我很容易的工作代碼。沒有臨時文件

using (FileStream reader = File.OpenRead(filePath)) 
    using (GZipStream zip = new GZipStream(reader, CompressionMode.Decompress, true)) 
     using (StreamReader unzip = new StreamReader(zip)) 
      while(!unzip.EndOfStream) 
       ReadLine(unzip.ReadLine()); 
+1

相當優雅,如果我不這麼說+1 – ppumkin 2017-09-27 19:30:43