(BluePrism)Utility - Windows Compressed Fileが日本向けじゃない件
ご無沙汰しております。おむおむです。
年末年始で公私ともにバタバタしており、
なかなかアウトプットの時間が取れず。。。
引っ越しって面倒だなぁ(詠嘆)
Utility - Windows Compressed Fileとは
その名の通りファイルを圧縮したり、展開するためのVBOです。
v6.5から導入されたやつです。
パスワード付きZipの操作はできません。
そんな面倒な運用してんじゃねぇ!という
英国からの圧を感じざるを得ません(違う)
v6.10現在、使用できるアクションは以下の通り。
処理内容は、まあ、名前のまんまです。
・Add File to Zip ・Create Zip from Folder ・Delete File from Zip ・Extract All from Zip ・Extract File from Zip ・Find File in Zip ・Get Zip Contents
使ってみると・・・?
例として、「Extract All from Zip」アクションを使って
Zipファイルを展開してみます。
テスト用に、Cドライブ直下に「temp」というフォルダを作り、
その中に「test.zip」というZipファイルを用意します。
中身はこんな感じです。
アクションの入力パラメータは、
Zipファイルのフルパスと展開先のフォルダパスです。
シンプル。
Cドライブのtempフォルダ配下に
そのまんま「test」という名前で展開しましょう。
はいできました。
中身見てみましょう。
文字化けしてるじゃないですかヤダー
ちなみに、他のアクションを使用しても
ファイル名にダブルバイト文字が含まれていると
同様に文字化けが発生します。
原因を考える
恐らく文字コードが違うからでしょう(ズバリ)。
今までファイルの中身の文字化けについては
何度か遭遇したことがありますが、
ファイル名の文字化けはあまり見かけませんでした。
Lhaplusとか7-Zipとか使ってると
自動的にいい感じにアレしてくれてるからでしょう(雑)
が、このVBOで使用されているZipFileクラスは
特に指定しない場合UTF-8でデコードしようとするみたいです。
そのため、Windowsのシステムロケールが日本になっていると
ファイル名にShift-JISが使われるため
文字化けが発生する、ということだと思います。
たぶん。おそらく。知らんけど。
というか、Windowsのファイル管理システムのNTFSは
Unicodeでファイル名を保存しているので
そのまんま使えばいいものの、
システムロケールでShift-JISが指定されていると
WindowsのAPIか何かでANSI(Shift-JIS)に変換されるのでしょうか?
マジでわからないので誰か教えてください...
docs.microsoft.com
解決法
原因は、まあ、さておき。
解決方法を以下に書いていきます。
もちろん自己責任でお願いします。
方法1. 外部の圧縮ファイル操作アプリケーションを使用する
これが一番手っ取り早い気がします。
7-Zipとか、Lhaplusとかです。
だいたいこれらのようなアプリケーションは、
コマンドラインから操作できるようになっているので、
Utility - EnvironmentのRun Process Until Endedを使用することで
比較的容易にZipファイルの操作が可能です。
例えば7-Zipを使用する場合、入力パラメータはこんな感じ。
(7-Zipはデフォルトのインストールフォルダにある前提です)
・Application : C:\Program Files\7-Zip\7z.exe ・Arguments : x -o<展開先のフォルダパス> <Zipファイルのフルパス> ・Working Folder : 指定なし ・Timeout : MakeTimeSpan(0, 0, 0, 30)
便利ですね。Igor Pavlovさんに感謝です。
そのほかのオプション(パスワード付きZipの作成とか)は
7z.exe -?
とかで調べてくださいな。
方法2. VBOのコードステージを書き換える
ここからは推奨しないので読み飛ばしてOKです。
だって実装めんどいし!
何をするかというと、コードステージを書き換えて
Shift-JISに対応させる、ただそれだけです。
まずはVBOを別名保存します。
Utility - Windows Compressed File - Extendedとかでいいと思います。
次に、初期化ページから名前空間にSystem.Textを追加します。
あとは各アクションでShift-JISを使用するように書き換えるだけです。
書き換える「だけ」、といいつつも、
引数だけでなくメソッドを変更するものもあるのでご注意を。
例えば、「Extract All from File」の場合は
ZipFile.ExtractToDirectory(sourcePath, destinationPath) ↓ ZipFile.ExtractToDirectory(sourcePath, destinationPath, Encoding.GetEncoding("shift_jis"))
と第3引数を追加するだけで済みますが、
「Get Zip Contents」の場合は9行目を
Using archive As ZipArchive = ZipFile.OpenRead(path) ↓ Using archive As ZipArchive = ZipFile.Open(path, 0, Encoding.GetEncoding("shift_jis"))
とする必要があります。
面倒だね☆
方法3. システムロケールを変更する
最後は、システムロケールを変更する方法です。
ゴリゴリに非推奨です。
要はファイル名にShift-JISが使われなければいいので、
そこを変更してしまおう、ということです。
まずはコントロールパネルの「地域」を選択し、
「管理」タブの「システムロケールの変更」から英語圏などを選択する、
もしくは「ベータ版: ワールドワイド言語サポートでUnicode UTF-8を使用」
にチェックを入れ、端末を再起動します。
注釈にもある通り、端末内のユーザ全体に影響が出るので
おすすめしないです。
特にバッチファイルを現役で使用しているような環境では
影響出まくりハマグリだと思います。
チェックボックスの項目がベータ版なのは、
多分コードページをUTF-8(CP65001)に変更することによる
影響等を完全にはチェックできてないから、とかそんな理由でしょう。
多分。知らんけど。
まとめ
・7-Zipは有能
・早くShift-JISから脱却したい
・今日のコメダ珈琲はちょっと暑い
今さらながらパラサイト 半地下の家族観ました。
心がしんどくなったのでお寿司でも食べよう。。。