プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

【C#】zipファイル名をzip1階層目の最初のフォルダ・ファイル名に変更するプログラム

あらすじ

DLsiteでダウンロードするとファイル名が番号
→いちいち変えるのがめんどくさい
→中身の1階層目が大体作品名
→そこから取ってきてリネームしよう

プログラム

以下のリンク先からダウンロードしてください。
ZipFileRenamer.zip

使い方

リネームしたいzipファイルをexeファイルにドラッグドロップしてください。
使ってたらウィルスバスターにひっかかったので、そのときは除外してください。
ファイル構成によってはリネームされないこともあります。
そんときは手動で変えてください。

動作例

リネームという名前のフォルダが格納されたxxx.zipとrenameという名前のフォルダが格納されたvvv.zipに使います。
f:id:shirakamisauto:20160517102851p:plain
f:id:shirakamisauto:20160517102853p:plain
f:id:shirakamisauto:20160517102854p:plain
f:id:shirakamisauto:20160517102858p:plain

コード

using System;
using System.Linq;
using System.Text;
using Ionic.Zip;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string[] files = Environment.GetCommandLineArgs();

        for (int i = 1; i < files.Length; i++)
        {
            var folderName = "";

            string zipPath = files[i];
            if (!ZipFile.IsZipFile(zipPath))
                continue;

            //シフトJISで読み込み
            var enc = new ReadOptions() { Encoding = Encoding.GetEncoding("shift_jis") };
            using (ZipFile zip = ZipFile.Read(zipPath, enc))
            {
                //zip直下のフォルダパスを取得
                folderName = Path.GetDirectoryName(zip[0].FileName).Split('\\').First();
                if (string.IsNullOrEmpty(folderName))
                    folderName = zip[0].FileName;
            }
            File.Move(zipPath, Path.GetDirectoryName(zipPath) + "\\" + folderName + ".zip");
        }
    }
}

解説

DotNetZipライブラリを使いました。
Nugetから取ってこれます。

格納されているファイルパスはzip直下からのアドレスです。
それをSplitで分割した最初の要素が1階層目のフォルダになります。
見つからない場合は直下がファイルなのでそのままファイル名を取得します。

本当はバイナリから取ってこようと思ったんですが、めんどくさいので止めました。