91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解C#壓縮、解壓文件夾/文件(帶密碼)

發布時間:2020-09-15 22:17:30 來源:腳本之家 閱讀:201 作者:傅小灰 欄目:開發技術

前言

今天梳理一下項目中用到的壓縮、解壓文件夾或文件的方法,發現因為需求不同,已經用了好幾個不同組件。今天就好好整理記錄下,別下次遇到需求又重頭開始了。

DotNetZip

DotNetZip是一個開源的免費類庫,主要提供了快速操作zip文件的工具集,VB、C#任何.Net語言都可以通過它創建、解壓縮zip文件。我使用該類庫最主要的目的還是因為它可以創建帶密碼保護的壓縮文件。

只有設置了zip.Password = "password"之后,被壓縮的文件才會有密碼保護

/// <summary>
/// 壓縮文件/文件夾
/// </summary>
/// <param name="filePath">需要壓縮的文件/文件夾路徑</param>
/// <param name="zipPath">壓縮文件路徑(zip后綴)</param>
/// <param name="password">密碼</param>
/// <param name="filterExtenList">需要過濾的文件后綴名</param>
public static void CompressionFile(string filePath, string zipPath, string password = "", List<string> filterExtenList = null)
{
 try
 {
  using (ZipFile zip = new ZipFile(Encoding.UTF8))
  {
   if (!string.IsNullOrWhiteSpace(password))
   {
    zip.Password = password;
   }
   if (Directory.Exists(filePath))
   {
    if (filterExtenList == null)
     zip.AddDirectory(filePath);
    else
     AddDirectory(zip, filePath, filePath, filterExtenList);
   }
   else if (File.Exists(filePath))
   {
    zip.AddFile(filePath,"");
   }
   zip.Save(zipPath);
  }
 }
 catch (Exception ex)
 {
  throw ex;
 }
}

/// <summary>
/// 添加文件夾
/// </summary>
/// <param name="zip">ZipFile對象</param>
/// <param name="dirPath">需要壓縮的文件夾路徑</param>
/// <param name="rootPath">根目錄路徑</param>
/// <param name="filterExtenList">需要過濾的文件后綴名</param>
public static void AddDirectory(ZipFile zip, string dirPath, string rootPath, List<string> filterExtenList)
{
 var files = Directory.GetFiles(dirPath);
 for (int i = 0; i < files.Length; i++)
 {
  //如果Contains不支持第二個參數,就用.ToLower()
  if (filterExtenList == null || (filterExtenList != null && !filterExtenList.Any(d => Path.GetExtension(files[i]).Contains(d, StringComparison.OrdinalIgnoreCase))))
  {
   //獲取相對路徑作為zip文件中目錄路徑
   zip.AddFile(files[i], Path.GetRelativePath(rootPath, dirPath));
   
  //如果沒有Path.GetRelativePath方法,可以用下面代碼替換
   //string relativePath = Path.GetFullPath(dirPath).Replace(Path.GetFullPath(rootPath), "");
   //zip.AddFile(files[i], relativePath);
  }
 }
 var dirs = Directory.GetDirectories(dirPath);
 for (int i = 0; i < dirs.Length; i++)
 {
  AddDirectory(zip, dirs[i], rootPath, filterExtenList);
 }
}

SharpCompress

SharpCompress是用到現在,感覺功能最強大的壓縮、解壓開源插件。它支持處理zip、rar、7z等多種格式的壓縮文件,使用方式也很簡單。當然,最讓我難受的是創建壓縮文件的時候沒法設置密碼~所以才有了上面DotnetZip的代碼。

SharpCompress版本不同,設置ArchiveEncoding的方式也不同,默認設置了UTF8防止解壓亂碼。
通過設置ArchiveType切換生成不同格式壓縮文件

/// <summary>
/// 壓縮文件/文件夾
/// </summary>
/// <param name="filePath">需要壓縮的文件/文件夾路徑</param>
/// <param name="zipPath">壓縮文件路徑(zip后綴)</param>
/// <param name="filterExtenList">需要過濾的文件后綴名</param>
public static void CompressionFile(string filePath, string zipPath, List<string> filterExtenList = null)
{
  try
  {
    using (var zip = File.Create(zipPath))
    {
      var option = new WriterOptions(CompressionType.Deflate)
      {
        ArchiveEncoding = new SharpCompress.Common.ArchiveEncoding()
        {
          Default = Encoding.UTF8
        }
      };
      using (var zipWriter = WriterFactory.Open(zip, ArchiveType.Zip, option))
      {
        if (Directory.Exists(filePath))
        {
          //添加文件夾
          zipWriter.WriteAll(filePath, "*",
            (path) => filterExtenList == null ? true : !filterExtenList.Any(d => Path.GetExtension(path).Contains(d, StringComparison.OrdinalIgnoreCase)), SearchOption.AllDirectories);
        }
        else if (File.Exists(filePath))
        {
          zipWriter.Write(Path.GetFileName(filePath), filePath);
        }
      }
    }
  }
  catch (Exception ex)
  {
    throw ex;
  }
}
/// <summary>
/// 解壓文件
/// </summary>
/// <param name="zipPath">壓縮文件路徑</param>
/// <param name="dirPath">解壓到文件夾路徑</param>
/// <param name="password">密碼</param>
public static void DeCompressionFile(string zipPath, string dirPath, string password = "")
{
  if (!File.Exists(zipPath))
  {
    throw new ArgumentNullException("zipPath壓縮文件不存在");
  }
  Directory.CreateDirectory(dirPath);
  try
  {
    using (Stream stream = File.OpenRead(zipPath))
    {
      var option = new ReaderOptions()
      {
        ArchiveEncoding = new SharpCompress.Common.ArchiveEncoding()
        {
          Default = Encoding.UTF8
        }
      };
      if (!string.IsNullOrWhiteSpace(password))
      {
        option.Password = password;
      }

      var reader = ReaderFactory.Open(stream, option);
      while (reader.MoveToNextEntry())
      {
        if (reader.Entry.IsDirectory)
        {
          Directory.CreateDirectory(Path.Combine(dirPath, reader.Entry.Key));
        }
        else
        {
           //創建父級目錄,防止Entry文件,解壓時由于目錄不存在報異常
           var file = Path.Combine(dirPath, reader.Entry.Key);
           Directory.CreateDirectory(Path.GetDirectoryName(file));
           reader.WriteEntryToFile(file);
        }
      }
    }
  }
  catch (Exception ex)
  {
    throw ex;
  }
}

總結

相似的插件還有SharpZipLib(支持更多的壓縮格式)、SevenZipSharp(專注處理7z格式壓縮文件)等,它們也都有各自的優缺點。但總的來說,上面的兩個組件已經滿足日常工作中的大部分需求,遇到相同問題的朋友可以參考下~

到此這篇關于C#壓縮、解壓文件夾/文件(帶密碼)的文章就介紹到這了,更多相關C#壓縮、解壓文件夾/文件內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉禾县| 扎鲁特旗| 寻甸| 滕州市| 庆云县| 红原县| 阳新县| 兴宁市| 资溪县| 永新县| 刚察县| 惠水县| 温州市| 赤水市| 石景山区| 沙坪坝区| 铁力市| 普宁市| 隆德县| 曲阳县| 上饶市| 龙游县| 绵竹市| 德阳市| 巴塘县| 石渠县| 蒲江县| 开封县| 平顶山市| 慈利县| 甘谷县| 大关县| 十堰市| 定南县| 桦甸市| 茌平县| 怀来县| 盐津县| 通榆县| 石楼县| 扶绥县|