C# 多文件压缩与解压

实现功能:

选择多个文件压缩成ZIP文件和解压ZIP文件

开发环境:

开发工具:Visual Studio 2013

.NET Framework版本:4.5

实现代码:

//需要添加ICSharpCode.SharpZipLib.Zip.dll到自己项目
private void btnCompressFile_Click(object sender, EventArgs e)
{

  listFiles.Items.Clear();

  OpenFileDialog ofd = new OpenFileDialog();

  ofd.Multiselect = true;

  if (ofd.ShowDialog() == DialogResult.OK)

  {

    listFiles.Items.AddRange(ofd.FileNames);

}
}

private void btnCompress_Click(object sender, EventArgs e)
{

  if (listFiles.Items.Count == 0)

  {

     MessageBox.Show("请先选择需要压缩的文件");

     return;

  }

  SaveFileDialog sfd = new SaveFileDialog();

  sfd.Filter = "压缩文件|*.zip";

if (sfd.ShowDialog() == DialogResult.OK)

  {

     string[] files = new string[listFiles.Items.Count];

     for (int i = 0; i < listFiles.Items.Count; i++)

{

      files[i] = listFiles.Items[i].ToString();

   }

    dynamic result;

    using (ZipOutputStream outStream = new ZipOutputStream(File.Create(sfd.FileName)))

    {

      result = Zip(files, outStream, "123");

    }

    MessageBox.Show(result.msg);

}
}
private void btnUnCompressFile_Click(object sender, EventArgs e)
{

  FolderBrowserDialog fbd = new FolderBrowserDialog();

  fbd.ShowNewFolderButton = true;

  if (fbd.ShowDialog() == DialogResult.OK)

  {

    txtOutFile.Text = fbd.SelectedPath;

  }

}

private void btnUnCompress_Click(object sender, EventArgs e)
{

  if (string.IsNullOrWhiteSpace(txtOutFile.Text))

  {

    MessageBox.Show("请先选择解压路径");

    return;

  }

  OpenFileDialog ofd = new OpenFileDialog();

  ofd.Filter = "压缩文件|*.zip";

  if (ofd.ShowDialog() == DialogResult.OK)

  {

    dynamic result = UnZip(ofd.FileName, txtOutFile.Text,"123");

    MessageBox.Show(result.msg);

  }

}

public dynamic Zip(string[] files, ZipOutputStream outStream, string pwd)

{

  try

  {

    for (int i = 0; i < files.Length; i++)

    {

      if (!File.Exists(files[i]))

      {

        throw new Exception("文件不存在");

      }

      using (FileStream fs = File.OpenRead(files[i]))

      {
  
          byte[] buffer = new byte[fs.Length];

          fs.Read(buffer, 0, buffer.Length);

          if (!string.IsNullOrWhiteSpace(pwd))

          {

             outStream.Password = pwd;

          }

          ZipEntry ZipEntry = new ZipEntry(Path.GetFileName(files[i]));

          outStream.PutNextEntry(ZipEntry);

          outStream.Write(buffer, 0, buffer.Length);

      }

     }

return new { result = true, msg = "压缩成功" };
}

  catch (Exception ex)

  {

     return new { result = true, msg = "压缩失败:" + ex.Message };

  }

}

public dynamic UnZip(string zipFile, string outPath, string pwd)
{

    try

    {

      if (!Directory.Exists(outPath))

      {

         Directory.CreateDirectory(outPath);

      }

      using (ZipInputStream zipInputStream = new ZipInputStream(File.OpenRead(zipFile)))

      {

          if (!string.IsNullOrWhiteSpace(pwd))

          {

            zipInputStream.Password = pwd;

          }

           ZipEntry theEntry;

         while ((theEntry = zipInputStream.GetNextEntry()) != null)

          {

            using (FileStream streamWriter = File.Create(outPath + "\\" + theEntry.Name))

            {

              byte[] data = new byte[1024 * 1024];

              int dataLength = 0;

              while ((dataLength = zipInputStream.Read(data, 0, data.Length)) > 0)

              {

                  streamWriter.Write(data, 0, dataLength);

              }

          }

}
    }

     return new { result = true, msg = "解压成功" };

}

catch (Exception ex)

   {

       return new { result = true, msg = "解压失败:" + ex.Message };

   }

}

 

 

 
posted @ 2022-01-24 15:09  华翎科技  阅读(170)  评论(0)    收藏  举报