こんにちは。明月です。
この投稿はC#でZip圧縮コードを作成する方法に関する説明です。
Zip圧縮アルゴリズムは私の考えて世界の中で一番よく使う圧縮アルゴリズムではないかと思います。アルゴリズムの優秀性もいいけれども、Zip圧縮アルゴリズムに関して多いライブラリがあり、接近性と便利性がよいからよく使うと思います。
C#の.Net Framework内部でもZipアルゴリズムがあります。
そのため、.Net Frameworkのソースをを利用して圧縮する方法と、Ionicライブラリを利用して圧縮する方法があります。
二つのライブラリでパフォーマンスの差がありません。ソースのステップの差もないので、ユーザが気になるもので使えばよいです。
Ionicライブラリ
Ionicライブラリは外部ライブラリなのでNugetを通ってIonicライブラリをダウンロードと連結をしましょう。
using System;
using System.Collections.Generic;
using System.IO;
using Ionic.Zip;
namespace CS_ZipCompressSource
{
class Program
{
// ファイルリストを取得する関数 (再帰を通ってSubディレクトリのファイルもすべて取得する。)
public static List<String> GetFileList(String rootPath, List<String> fileList = null)
{
// ファイルリストを格納するリストがNULLなら返却
if (fileList == null)
{
fileList = new List<string>();
}
// fileのパスの属性を取得する。
var attr = File.GetAttributes(rootPath);
// ディレクトリの場合
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
{
// ディレクトリ情報を取得する。
var dirInfo = new DirectoryInfo(rootPath);
// ディレクトリリストを取得する。
foreach (var dir in dirInfo.GetDirectories())
{
// 再帰要請でサブディレクトリを探索する。
GetFileList(dir.FullName, fileList);
}
// ファイルリストを取得する。
foreach (var file in dirInfo.GetFiles())
{
// 再帰要請でファイルを検索する。
GetFileList(file.FullName, fileList);
}
}
// ファイルの場合
else
{
// ファイル情報を取得する。
var fileInfo = new FileInfo(rootPath);
// リストの絶対パスを格納する。
fileList.Add(fileInfo.FullName);
}
return fileList;
}
// 圧縮実行関数
public static void CompressZipByIonic(string sourcePath, string zipPath)
{
// sourcePathのパラメータからディレクトリを取得する。
var filelist = GetFileList(sourcePath);
// ファイルのリストで圧縮を開始する。
using (var zip = new ZipFile())
{
// ファイルのリストを繰り返す。
foreach (string file in filelist)
{
// 絶対パスで相対パスに変更。
string path = file.Substring(sourcePath.Length + 1);
// zipオブジェクトでファイルを追加する。
zip.AddEntry(path, File.ReadAllBytes(file));
}
// ファイル格納
zip.Save(zipPath);
}
}
// 実行関数
static void Main(string[] args)
{
// D:\work\CompressTestのディレクトリを圧縮してD:\work\CompressTest\Ionic.zipのファイルで作成する。
CompressZipByIonic(@"D:\work\CompressTest", @"D:\work\CompressTest\Ionic.zip");
Console.WriteLine("Press any key...");
Console.ReadKey();
}
}
}
D:\work\CompressTestのディレクトリを圧縮しましょう。
実行しました。
圧縮ファイルが作成されたことを確認できます。
圧縮ファイル内を確認しましょう。
圧縮が正常にできました。
.Net Framework内部を利用する方法
先に「System.IO.Commpress」と「System.IO.Comppression.FileSystem」を追加しましょう。
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
namespace CS_ZipCompressSource
{
class Program
{
// ファイルリストを取得する関数 (再帰を通ってSubディレクトリのファイルもすべて取得する。)
public static List<String> GetFileList(String rootPath, List<String> fileList = null)
{
// ファイルリストを格納するリストがNULLなら返却
if (fileList == null)
{
fileList = new List<string>();
}
// fileのパスの属性を取得する。
var attr = File.GetAttributes(rootPath);
// ディレクトリの場合
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
{
// ディレクトリ情報を取得する。
var dirInfo = new DirectoryInfo(rootPath);
// ディレクトリリストを取得する。
foreach (var dir in dirInfo.GetDirectories())
{
// 再帰要請でサブディレクトリを探索する。
GetFileList(dir.FullName, fileList);
}
// ファイルリストを取得する。
foreach (var file in dirInfo.GetFiles())
{
// 再帰要請でファイルを検索する。
GetFileList(file.FullName, fileList);
}
}
// ファイルの場合
else
{
// ファイル情報を取得する。
var fileInfo = new FileInfo(rootPath);
// リストの絶対パスを格納する。
fileList.Add(fileInfo.FullName);
}
return fileList;
}
// 圧縮実行関数
public static void CompressZipByIO(string sourcePath, string zipPath)
{
// sourcePathのパラメータからディレクトリを取得する。
var filelist = GetFileList(sourcePath, new List<String>());
// ファイルを生成するようにストリームを取得する。
using (FileStream fileStream = new FileStream(zipPath, FileMode.Create, FileAccess.ReadWrite))
{
// 圧縮ファイルを生成する。
using (ZipArchive zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Create))
{
// ファイルのリストを繰り返す。
foreach (string file in filelist)
{
// 絶対パスで相対パスに変更。
string path = file.Substring(sourcePath.Length + 1);
// zipオブジェクトでファイルを追加する。
zipArchive.CreateEntryFromFile(file, path);
}
}
}
}
static void Main(string[] args)
{
CompressZipByIO(@"D:\work\CompressTest", @"D:\work\CompressTest\IO.zip");
Console.WriteLine("Press any key...");
Console.ReadKey();
}
}
}
D:\work\CompressTestのディレクトリを圧縮しましょう。
実行しました。
圧縮ファイルが作成されたことを確認できます。
圧縮ファイル内を確認しましょう。
Ionicライブラリと標準ライブラリを利用するソーススタイルが似てます。圧縮解凍は少し差がありますが、圧縮することは同じです。
そうすると標準ライブラリを使うほうがオープンライブラリを利用することより良いと思います。
ここまでC#でZip圧縮コードを作成する方法に関する説明でした。
ご不明なところや間違いところがあればコメントしてください。
- [C#] EMailを送信する方法(System.Net.Mail)2020/04/22 19:00:42
- [C#] ini環境ファイルを使う方法2020/04/22 00:09:39
- [C#] 環境設定ファイルを扱う方法(System.Configuration)2020/04/20 19:37:57
- [C#] Reflectionを利用してクラス複製する方法2020/04/17 00:34:33
- [C#] XMLをXPathを利用してデータを取得する方法2020/04/16 00:47:17
- [C#] NSoupライブラリを利用してXMLとHTMLをパーシングする方法2020/04/14 19:34:15
- [C#] 日付フォーマット2020/04/09 20:53:20
- [C#] ログライブラリ(log4net)を設定する方法2020/04/08 13:04:22
- [C#] Zipの圧縮ファイルを解凍するコードを作成する方法2020/04/07 11:17:44
- [C#] Zip圧縮コードを作成する方法2020/04/06 14:56:13
- [C#] 数字フォーマット(お金表示及び小数点以下表示)2020/04/03 00:38:37
- [C#] コマンド(cmd)を実行する方法(Processクラス)2020/03/31 07:15:40
- [C#] FTPに接続してファイルダウンロード、アップロードする方法2020/03/27 19:20:14
- [C#] HttpWebRequestを利用してウェブページを読み込みする方法2020/03/27 00:23:19
- [C#] Base64のエンコード、デコードする方法2020/03/26 02:19:50
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07