LoginSignup
1
1

More than 5 years have passed since last update.

macでC# (monoでzip)

Posted at

cでzipを扱おうとして挫折した経験がある。c#では簡単!なはず、で、macでもc#ができる!?ということで初めてC#をやってみました。

  • mono

以下のように、.Netの実行コンパイル環境のmonoをインストール。これでC#プログラムtest.csのコンパイル、実行ができる。

terminal
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がいるらしい。以下のように明示的に指定してコンパイルと、これで動いた!。

terminal
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をとってきた。

terminal
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でも動くのか。という疑問はある。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1