トップ回答者
Shell.Application.NameSpace(zipfile)でNothing(null)に

質問
-
こんにちは。お世話になります。
VB.NET 2010(.NET Framework 3.5) で Windows7のフォームアプリケーションを作成しています。
あるフォルダの中に存在するzipファイルの中身を、同じフォルダ内に解凍させるために(ちょっときれいな仕様ではありませんが)、次のようなコードを組みました。
Dim shellApp As Object = CreateObject("Shell.Application") For Each zipPath In System.IO.Directory.GetFiles(dirPath, "*.zip") Dim srcFldr As Object = shellApp.NameSpace(zipPath) Dim destFldr As Object = shellApp.NameSpace(System.IO.Path.GetDirectoryName(zipPath)) destFldr.CopyHere((srcFldr.Items), &H210) Next
これを実行させると、途中 srcFldr には Nothing が返ってきます。したがって、CopyHere() の箇所では Null 参照となりエラーになります。
Shell.Application.NameSpace (zipファイル) とすれば、zipファイルをフォルダとみなしてもらえるような情報を、ネット上でいろいろ紹介されているようですが、私の認識は間違えているでしょうか?ちなみに、該当するzipファイルは、エクスプローラでもzipファイル解凍ツールでもしっかり解凍できるもので、アクセス権はEveryoneにフルアクセス許可させています。
情報をいただけますと幸いです。
ちなみに私のVisualStudio2012は、なぜか起動時にUACの確認が表示されますが、この辺が何か関係したりするでしょうか?
回答
-
ZIP フォルダーのシェル拡張 DLL を登録解除しているなどの条件を満たさない環境では、ご提示の方法は使えないと思います。
実際、私の手元では標準の ZIP フォルダー展開機能でフォルダーが開くことがいやなので登録を解除してありますので、該当のコードは動きません。(私のようなことをやっている人が世の中にどのくらいいるかは別問題ですが)
また、CopyHere をプログラムから使って ZIP 解凍することはサポート外と告知されています。確実な処理を実現するためには、 DotNetZip などの ZIP 解凍ソリューションを検討するべきでしょう。
あるいは、.NET 4.5 以上に絞ってよいのであれば、追加されたクラス群を使うのも手でしょう。(.NET 4.5 を選択した場合、XP はサポート外になります)- 編集済み AzuleanMVP, Moderator 2013年2月18日 13:50
- 回答の候補に設定 佐伯玲 2013年2月20日 2:34
- 回答としてマーク Always fresh 2013年2月20日 3:27
すべての返信
-
ZIP フォルダーのシェル拡張 DLL を登録解除しているなどの条件を満たさない環境では、ご提示の方法は使えないと思います。
実際、私の手元では標準の ZIP フォルダー展開機能でフォルダーが開くことがいやなので登録を解除してありますので、該当のコードは動きません。(私のようなことをやっている人が世の中にどのくらいいるかは別問題ですが)
また、CopyHere をプログラムから使って ZIP 解凍することはサポート外と告知されています。確実な処理を実現するためには、 DotNetZip などの ZIP 解凍ソリューションを検討するべきでしょう。
あるいは、.NET 4.5 以上に絞ってよいのであれば、追加されたクラス群を使うのも手でしょう。(.NET 4.5 を選択した場合、XP はサポート外になります)- 編集済み AzuleanMVP, Moderator 2013年2月18日 13:50
- 回答の候補に設定 佐伯玲 2013年2月20日 2:34
- 回答としてマーク Always fresh 2013年2月20日 3:27