博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#生成压缩文件

Posted on 2016-10-19 16:27  first_start  阅读(173)  评论(0)    收藏  举报

/// <summary>
/// ZIPファイルへの圧縮関数
/// </summary>
/// <param name="zipFilePath">パス付圧縮ファイル名</param>
/// <param name="srcFileList">圧縮対象ファイル 複数ファイル指定の場合は、ワイルドカードは不可</param>
/// <param name="password">圧縮ファイルのパスワード</param>
/// <returns>正常:0 異常:0以外</returns>
public static int PackZip(string zipFilePath, ArrayList srcFileList, string password)
{
// 開始ログ
DLLogManager.WriteInfoLog(DLL_NAME, MethodBase.GetCurrentMethod().Name, "RPT0000001", "ファイル圧縮処理");

int ret = (int)CommonConst.Status.Normal;// 戻り値

ArrayList fileList = new ArrayList();
try
{
// 圧縮対象ファイル数が1の場合、ワイルドカードが指定されているかもしれないので、ファイルを検索
if (srcFileList.Count == 1)
{
string srcFolder = Path.GetDirectoryName(srcFileList[0].ToString());
string srcFile = Path.GetFileName(srcFileList[0].ToString());
// 該当ファイルをすべて取得する
IEnumerable<string> files =
System.IO.Directory.EnumerateFiles(
srcFolder, srcFile, System.IO.SearchOption.TopDirectoryOnly);

//ファイルを列挙する
foreach (string file in files)
{
fileList.Add(file);
}
}
// 複数の場合、存在するファイルのみを取得する
else
{
for (int i = 0; i <= srcFileList.Count - 1; i++)
{
string zipFile = srcFileList[i].ToString();

//圧縮対象ファイルファイルが存在しない場合、警告ログを出力する
if (!File.Exists(zipFile))
{
DLLogManager.WriteWarnLog(DLL_NAME, MethodBase.GetCurrentMethod().Name, "RPT0000001", zipFile);
}
else
{
//ファイルを取得する
fileList.Add(zipFile);
}
}
}
// ソート
fileList.Sort();

// 0件の場合はエラー処理を行い、処理を終了する
if (fileList.Count == 0)
{
// エラーログ出力
DLLogManager.WriteErrLog(DLL_NAME, MethodBase.GetCurrentMethod().Name, "RPT0000012");
return (int)CommonConst.Status.Error;
}

//ZipFileを作成する
using (Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile())
{
//IBM437でエンコードできないファイル名やコメントをShift JISでエンコード
zip.AlternateEncoding = System.Text.Encoding.GetEncoding("shift_jis");
zip.AlternateEncodingUsage = Ionic.Zip.ZipOption.Always;
//圧縮レベルを変更
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;

// Xpとかで解凍できない可能性がある為ZIP64は未使用とする
zip.UseZip64WhenSaving = Ionic.Zip.Zip64Option.Never;

//エラーが出てもスキップする。デフォルトはThrow。
zip.ZipErrorAction = Ionic.Zip.ZipErrorAction.Skip;

// パスワード設定されていたらパスワードを付ける
if (!string.Empty.Equals(password))
{
zip.Password = password;
}
// ファイル数の設定により作成するZIPファイルを変更する
// ファイル数で分割してZIPファイルを作成する場合
for (int n = 0; n < fileList.Count; n++)
{
// 指定されたファイルを追加する
zip.AddFile(fileList[n].ToString(), "");
}
//ZIP書庫を作成する
zip.Save(zipFilePath);
}
}
catch (Exception e)
{
// ログ出力
DLLogManager.WriteErrLog(DLL_NAME, MethodBase.GetCurrentMethod().Name, e, "RPT0000009");
// エラーコードをリターンする
return (int)CommonConst.Status.Error;
}
finally
{
// 終了ログ
DLLogManager.WriteInfoLog(DLL_NAME, MethodBase.GetCurrentMethod().Name, "RPT0000002", "ファイル圧縮処理");
}
return ret;
}