Skip to content

System.IO.Compression.ZipArchive

Example

파일에서 읽는 방법

public string ReadMusicXml(string path)
{
    using (var zippedStream = new FileStream(path, FileMode.Open))
    {
        using (var archive = new ZipArchive(zippedStream))
        {
            foreach (var entry in archive.Entries)
            {
                if (entry.Name == ".xml")
                {
                    using (var unzippedEntryStream = entry.Open())
                    {
                        using (var ms = new MemoryStream())
                        {
                            unzippedEntryStream.CopyTo(ms);
                            // return ms.ToArray();
                            var unzippedArray = ms.ToArray();
                            return Encoding.Default.GetString(unzippedArray);
                        }
                    }
                }
            }
        }
    }
    throw new FileNotFoundException();
}

메모리에서 읽는 방법

using System.IO;  // MemoryStream
using System.Text;  // Encoding

/// <summary>
/// Zip and Unzip in memory using System.IO.Compression.
/// </summary>;
/// <remarks>
/// Include System.IO.Compression in your project.
/// </remarks>
public static class ZipHelper
{
  /// <summary>
  /// Zips a string into a zipped byte array.
  /// </summary>
  /// <param name="textToZip">The text to be zipped.</param>
  /// <returns>byte[] representing a zipped stream</returns>
  public static byte[] Zip(string textToZip)
  {
    using (var memoryStream = new MemoryStream())
    {
      using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
      {
        var demoFile = zipArchive.CreateEntry("zipped.txt");
        using (var entryStream = demoFile.Open())
        {
          using (var streamWriter = new StreamWriter(entryStream))
          {
            streamWriter.Write(textToZip);
          }
        }
      }
      return memoryStream.ToArray();
    }
  }

  /// <summary>
  /// Unzip a zipped byte array into a string.
  /// </summary>
  /// <param name="zippedBuffer">The byte array to be unzipped</param>
  /// <returns>string representing the original stream</returns>
  public static string Unzip(byte[] zippedBuffer)
  {
    using (var zippedStream = new MemoryStream(zippedBuffer))
    {
      using (var archive = new ZipArchive(zippedStream))
      {
        var entry = archive.Entries.FirstOrDefault();

        if (entry != null)
        {
          using (var unzippedEntryStream = entry.Open())
          {
            using (var ms = new MemoryStream())
            {
              unzippedEntryStream.CopyTo(ms);
              var unzippedArray = ms.ToArray();
              return Encoding.Default.GetString(unzippedArray);
            }
          }
        }
        return null;
      }
    }
  }
}

Troubleshooting

ZipArchive 를 System.IO.Compression 에서 찾을 수 없다

프로젝트 파일(.csproj)에 다음 내용을 추가한다.

<ItemGroup>
  <Reference Include="System.IO.Compression" />
</ItemGroup>

See also

Favorite iste