cでzipを扱おうとして挫折した経験がある。c#では簡単!なはず、で、macでもc#ができる!?ということで初めてC#をやってみました。
- mono
以下のように、.Netの実行コンパイル環境のmonoをインストール。これでC#プログラムtest.csのコンパイル、実行ができる。
brew install mono # インストール
mcs test.cs # コンパイル
mono test.exe # 実行
- プログラム
https://msdn.microsoft.com/ja-jp/library/system.io.compression.zipfile(v=vs.110).aspx
のサンプル通り、vscodeで以下のプログラム(ziptest.cs)を作成
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string startPath = @"/Users/xxx/srcdir";
string zipPath = @"/Users/xxx/srcdir.zip";
string extractPath = @"/Users/xxx/dstdir";
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
}
}
}
普通に、
mcs ziptest.cs # コンパイル
mono ziptest.exe # 実行
とすると、エラー。
ziptest.cs(18,13): error CS0103: The name `ZipFile' does not exist in the current context
確かにソースにはZipFileの定義なし(が、参考にしたサンプルでも定義なし)。調べると、System.IO.Compression.Filesystemがいるらしい。以下のように明示的に指定してコンパイルと、これで動いた!。
mcs -r:System.IO.Compression.Filesystem ziptest.cs
実際の手順では、後述するように、nugetでSystem.IO.Compressionを持ってきていたが、それはおそらく不要なのではと思われる。ただ、もし上記の-r:で指定だけではダメな場合、試しても良いかも。
nuget (-r:System.IO.Compression.Filesystemにたどり着くまで)
まずは、System.IO.Compression.Filesystemを探せ!、nugetなるものがあるようだ、ということで、以下のようにして、System.IO.Compressionをとってきた。
brew install nuget # nugetインストール
nuget install System.IO.Compression # ライブラリのインストール??
これでカレントディレクトリにSystem.IO.Compression.4.1.1なるファルダが作られ何かダウンロードされた。がとってきたは良いが、使い方(リンク方法)が分からない。。。どこかのシステムディレクトリに移動するのか?。とりあえずディレクトリを見るとdllがあるようなのでこれのリンクを試みる。
mcs -L System.IO.Compression.4.1.1/lib/net46/
もダメ、
macs -r:System.IO.Compression.4.1.1/lib/net46/System.IO.Compression.dll
もダメ。
途方に暮れていたところ、manを見ると-r:オプションは、ライブラリの
実体ではなく、名前を指定するみたいなので、-r:System.IO.Compression.Filesystemとしたら、できた。(-r:System.IO.Compressionではダメ。しかしなぜコロン)
以下備考:
-
オフィシャルのnugetページ、https://dist.nuget.org/index.htmlを見ると、Mac用バイナリが見えない!?。まあbrewにあったからそこからインストール
-
明示的な必要クラス指定(-r:System.IO.Compression.Filesystem)とか、本当に毎回必要なのか??というのは疑問。普通、インストールパスかライブラリパスに入っていれば何の指定もなく、コンパイルできるだろう。何か間違っているのか。。
-
どうも最初(monoをインストールした時点で)から、System.IO.Compression.Filesystemはあった(=nugetでの追加インストールは不要だった)。なような気がする。が、不明。
-
実は40-System.IO.Compression.FileSystemが先に見つかった(が個人作成なので、これは違うと思いやめておいた、個人ソフトを動かした場合のセキュリティーも確かでないし)
-
果たしてこのexe(.Net中間フォーマット)は別環境、例えば、windowsでも動くのか。という疑問はある。