C#プログラムのコンパイルで「現在のコンテキストに 'ZipFile' という名前は存在しません」の意味が分からなかった勘の悪さを反省するメモ
悲しいかな、たった数行のC#のプログラムに苦労してしまったので反省のメモ。
ZipFile クラス (System.IO.Compression) | Microsoft Docs
を参考にして、Zipファイルを作成するプログラムを書こうとしたが・・・。
create_zip.cs
using System; using System.IO.Compression; class Program { static void Main(string[] args) { var src ="./mydir"; var dest = "./mydir.zip"; ZipFile.CreateFromDirectory(src,dest); } }
しかし、コンパイルしようとすると
create_zip.cs(5,1): error CS0103: 現在のコンテキストに 'ZipFile' という名前は存在しません
と怒られる。
「ちゃんと using で名前空間を指定しているのになぁー?」
しばらく悩んだすえ、もう一度、先のページを見てみると、
!注意 .NET Framework アプリでクラスを使用ZipFileするには、プロジェクト内のアセンブリへの参照を追加するSystem.IO.Compression.FileSystem必要があります
と書いてあった。「注意」に注意しなかったことが原因だった。
目立つように色付けしてあったが、なぜか目にとまらなかった。
アセンブリを参照するようにしたらコンパイルできるようになった。
メモ書きの意図もあり、アセンブリ参照には応答ファイル を用意した。
my.rsp
# # response file # # csc .\create_zip.cs `@my.rsp # /reference:System.IO.Compression.FileSystem.dll
csc .\create_zip.cs `@my.rsp
※私は習慣で、powershellのコマンドラインからコンパイルするので "@"はバッククォート"`"でエスケープする必要がある。(おっ!なんか"`@"の色が変わっている!?)
「名前は存在しません」はもう少し分かりやすいメッセージにして欲しい気持ちもするが、言い訳はやめておこう。
また、初心者に戻ってしまった。
※なお、確認のために解凍するときは powershellのexpand-archiveを使った。
「だったら圧縮するときも、compress-archiveでいいじゃん」という声が・・・。
了