none
Shell.Application.NameSpace(zipfile)でNothing(null)に RRS feed

  • 質問

  • こんにちは。お世話になります。

    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の確認が表示されますが、この辺が何か関係したりするでしょうか?


    2013年2月18日 12:38

回答

すべての返信

  • ZIP フォルダーのシェル拡張 DLL を登録解除しているなどの条件を満たさない環境では、ご提示の方法は使えないと思います。
    実際、私の手元では標準の ZIP フォルダー展開機能でフォルダーが開くことがいやなので登録を解除してありますので、該当のコードは動きません。(私のようなことをやっている人が世の中にどのくらいいるかは別問題ですが)
    また、CopyHere をプログラムから使って ZIP 解凍することはサポート外と告知されています

    確実な処理を実現するためには、 DotNetZip などの ZIP 解凍ソリューションを検討するべきでしょう。
    あるいは、.NET 4.5 以上に絞ってよいのであれば、追加されたクラス群を使うのも手でしょう。(.NET 4.5 を選択した場合、XP はサポート外になります)

    2013年2月18日 13:49
    モデレータ
  • Azulean 様

    どうも有難う御座います。助かりました。

    公式にはサポートされておらず、環境によっては現に動作しない場合があるのですね。

    ご教示いただきましたライブラリ使用をの検討してみたいと思います。

    2013年2月20日 3:31