• 締切済み

Window(XP,2003等)標準機能の「ZIP圧縮・展開」をVBに

Window(XP,2003等)標準機能の「ZIP圧縮・展開」をVBに組み込めますでしょうか? VBで、圧縮ファイルを展開する、ということをしたいのですが、 ネット上に沢山サンプルがある「外部DLL(unzip32.dllなど)を使用する」という方法は、 使用条件によっては外部DLLのライセンスの問題が絡んでくるようですので、 Windowsの標準機能を組み込めないか?と考えたところです。 Windowsの標準機能、と記載しましたが、  ・ファイルを右クリック→送る→圧縮(zip形式)フォルダ  ・ファイルを右クリック→送る→すべて展開 のことを指しました。 ご指導よろしくお願いいたします。

みんなの回答

回答No.3

>引数「vDestination」がStringだとエラーになるようで、 その通りです。 VBScriptだと逆にStringで切ってあげないといけないのですが、Object以外の型を持つ言語では、Stringで渡すと逆にダメという状態になります。 VBScriptはStringで渡すことによって、最も適したObject型に自動キャストされます。 VBからStringで渡すと、Stringのままオブジェクト扱いされてしまいます。 サンプルは参照設定をしているので、用意されているメソッドが入力候補に現れます。 暇なときにでも、一度試されることをお勧めいたします。 少しのアドバイスでサンプルも見つけ、独自に理解されていくタイプの方のようですね。 スキルの高さを感じました。 がんばってください。 業務放棄の現実逃避者より

回答No.2

VB6用に作ってみました。 予期せぬ系は無視です。 Private m_objFso As Scripting.FileSystemObject Private m_objShell As Shell32.Shell Private Sub Command1_Click()   Dim l_colPrm As New Collection   l_colPrm.Add ("C:\WINDOWS\しゃくなげ.bmp")   l_colPrm.Add ("C:\WINDOWS\シャボン.bmp")      Call 圧縮("C:\test.zip", l_colPrm)      Call 解凍("C:\test.zip", "c:\")    End Sub Private Sub Form_Initialize()   Set m_objShell = New Shell32.Shell   Set m_objFso = New Scripting.FileSystemObject End Sub Private Sub Form_Terminate()   Set m_objFso = Nothing   Set m_objShell = Nothing End Sub Private Sub 圧縮(p_strZipPath As String, p_colPrm As Collection)   '空ZIP作成   Call CreZipNull(p_strZipPath)   '書庫に追加していく   Call CreZip(p_strZipPath, p_colPrm) End Sub Private Sub 解凍(p_strZipPath As String, p_strOutPath)   Dim l_objZIP    As Shell32.Folder   Dim l_objZIPItem  As Shell32.FolderItem   Dim l_objOut    As Shell32.Folder   '書庫オブジェクトを取得する   Set l_objZIP = m_objShell.NameSpace(p_strZipPath)   '解凍先を取得する   Set l_objOut = m_objShell.NameSpace(p_strOutPath)   '解凍していく   For Each l_objZIPItem In l_objZIP.Items     Call l_objOut.CopyHere(l_objZIPItem)   Next l_objZIPItem End Sub Private Sub CreZip(p_strZipPath As String, p_colParams As Collection)   Dim l_objZIP    As Shell32.Folder   Dim l_objZIPItem  As Shell32.FolderItem   Dim l_strItem    As String   Dim l_strName    As String   Dim l_intCount   As Integer   Dim i        As Integer   '書庫オブジェクトを取得する   Set l_objZIP = m_objShell.NameSpace(p_strZipPath)   '圧縮対象のファイルを取得する   For i = 1 To p_colParams.Count     l_strItem = p_colParams(i)     '名前を取得する     l_strName = m_objFso.GetFileName(l_strItem)     '現在のアイテム数を取得     l_intCount = l_objZIP.Items().Count     '書庫への追加を行う     Call l_objZIP.CopyHere(l_strItem)     '書庫追加が完了するまで待機     Do While (l_intCount < l_objZIP.Items().Count)       DoEvents     Loop   Next End Sub Private Sub CreZipNull(p_strZipName As String)   Call m_objFso.CreateTextFile(p_strZipName, True).Write("PK" & Chr(5) & Chr(6) & String(18, 0)) End Sub

参考URL:
http://okwave.jp/qa/q5807506.html
OK_Akiko
質問者

お礼

1050YEN様、再度ご回答ありがとうございます!! 前回ご回答いただき、今作成し、やっとか出来上がったところでしたので おしらせしようとしていたところでした。 私が作ったのは、 ' Zipファイル展開関数 Function ExtraceZIP(vZipFile As Variant, vDestination As Variant) Dim objFileSys As Object Dim objShell As Object Dim objFile As Object Dim objDestination As Object On Error GoTo ZipDeco_Err ' ファイルシステムオブジェクトおよびシェルオブジェクト作成 Set objFileSys = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("Shell.Application") ' 対象がZipファイルかチェック If UCase(objFileSys.GetExtensionName(vZipFile)) <> "ZIP" Then MsgBox "Invalid Extension Name" Exit Function End If ' 展開先パスがなければ作成する If Dir(vDestination, vbDirectory) = "" Then MkDir vDestination End If ' Zipファイルオブジェクト作成 Set objFile = objShell.NameSpace(vZipFile) ' 展開先オブジェクト作成 Set objDestination = objShell.NameSpace(vDestination) ' 展開 ' Zipファイルにアーカイブされているファイルが全て展開される objDestination.CopyHere objFile.Items On Error GoTo 0 Exit Function ZipDeco_Err: MsgBox "Zipファイル展開でエラーが発生しました" & Chr(13) & _ "エラーナンバー:" & Err.Number & Chr(13) & _ "エラー内容:" & Err.Description, vbOKOnly On Error GoTo 0 End Function となりました。 オブジェクトを作成するところ Set objDestination = objShell.NameSpace(vDestination) の、引数「vDestination」がStringだとエラーになるようで、 それがわからず時間がかかっていました。 なぜかは??です。 1050YEN様が組んでくださったロジックも調べてみたいと思います。 またご報告いたします!

回答No.1

VBのばーじょんは? VBScriptでもできますが。。。 「CopyHere」「ZIP」 これでググると、結構サンプルありますよ。 最近の質問でも上がっています。

OK_Akiko
質問者

お礼

1050YEN様、ご回答ありがとうございます! VBのバージョンは6.0です。 VBSCriptでもできるのですか! CopyHereと一緒に調べてみます! ありがとうございました!

関連するQ&A

  • XP標準のzip圧縮機能を削除してしまいました

    お世話になってます。 WindowsXP Homeに、ZIP圧縮ファイルを作成する機能が標準でついていると思います。 ファイルを右クリックして「送る→圧縮 (zip 形式) フォルダ」にて 作成することができます。 ところが、誤って「SendTo」フォルダにある圧縮 (zip 形式) フォルダ を削除してしまいました。 一応、何もないところで右クリック→新規作成→圧縮 (zip 形式) フォルダ にて作成することはできるのですが、送るで一発でできたほうが何かと便利なので…。 これを復元する方法はありますでしょうか。ちなみにシステムの復元はオフにしていたため使えません。 よろしくお願いいたします!

  • ZIPを操作したい(VB.NET、dll)

    現在VB6で、UNLHA32.dllを使用して ・LZHの圧縮 ・LZHの解凍 ・LZH内のテキストファイルの読み込み の操作をしています。 今回、VB6からVB.NETへ言語を変換することになりました。 そのタイミングで、LZHではなくZIPを使うことにもなりました。 (LZHはセキュリティ的に使うべきでないからという理由だと思います。) そこでLZHで行っていた操作を、ZIPに置き換えて実現するにはどうすればよいでしょうか? VB.NETの機能でZIP操作できるようなのですが、FrameWork4.5以上からのようなので、バージョンで操作できる・できないが出てしまうならdllを使うべきなのかなと思っています。 dllで調べていくと、UNZIP32.dllやzip32.dll、zip32j.dllなどがあることを知りました。 UNLHA32.dllではそれ1つで解凍や圧縮ができたのですが、 UNZIP32.dllでは解凍のみ、zip32.dllやzip32j.dllは圧縮のみのようです。 ただ、本文の最初に挙げていた、 圧縮状態のまま、その中にあるテキストファイルの読み込み がどうすれば実現できるのかが調べていても分かりませんでした。 また、先ほど挙げたZIP操作のdllをVB.NETで使用していくにあたっての コーディングなどについてもなかなか検索しても見つからず、 どうすればいいのか見えてこない状態です。 (私の検索方法が良くないのかもしれませんが・・・) それ以外にもzip32.dllとzip32j.dllの両方を組み合わせて使うようなのですが、 その理由も分からないです。 助言をいただけないでしょうか。 p.s. 入社したてのスキル不足なSEです。 初歩的な質問だったらすみません。

  • zip形式の圧縮だけできない

    数多くの圧縮・解凍できるフリーソフトがありますが、 先日XPに変えてからそれらのソフトでzip形式のものだけ圧縮できなくなってしまいました。 そのフリーソフトがXPに対応してないものもありましたが、lhaやcab形式などは問題なく圧縮できました。 Lacha、Lhaplusというソフトの場合だけzip形式の圧縮が可能でした。 zipの圧縮ができないとされるソフトが使用しているDLLはsystem32フォルダに入っています。 「UNZIP32.DLL」「IZIP32J.DLL」「ZIP32J.DLL」といったものを入れています。 参考までにzip圧縮ができなかったソフトを挙げます。 「LHUT32」「ONEPACALL2」「連続圧縮」「連続あっしゅ君」 これらは外部DLLを使用するようなのでそれが関係してるのかと自分は考えたのですが。 あとは複数ファイルを個別に圧縮する機能を持っているという特徴ぐらいでしょうか。 何かおわかりでしたら、よろしくお願いします。

  • windows xp標準のzipが効かない

    Windows XPを使っています。PCはPanasonic CF-R8です。 標準のZip機能でJPEGファイルを圧縮したいのですが、「送る→ZIP形式フォルダ」を選択して実行しても、圧縮前と圧縮後のサイズが全く変わっていないようです。 1点6~7メガの写真3枚を1つのフォルダにまとめ、フォルダ単位のサイズは20.8MBです。 これを右クリックして「送る→Zip」を実行するとZipされたフォルダが生成されます。 Zipフォルダのサイズを見ると、同じく20.8MBです。試しにメールに添付しても重くて送れず、 やはり圧縮できていないようです。 どうしたら圧縮できるでしょうか?! 宜しくお願いします!

  • zipの展開方法を教えてください

    zipを展開できません。アイコンを右クリックしてすべて展開をクリックすると圧縮フォルダーの展開ウィザードを完了できませんと表示されます。いろいろ試しているうちに「圧縮フォルダーは空です。ファイルを展開する前に、ファイルをこの圧縮フォルダーにコピーする必要があります」と表示されました。このノートpcにzipアプリが入っていないのでしょうか。アプリ一覧には「zip」は見当たりません。 お詳しい方のご指導お待ちします。(何しろいつまでも初心者ですので) ※OKWAVEより補足:「富士通FMV」についての質問です。

  • zipファイル(圧縮)について

    圧縮されたzipファイルについて質問があります。 今まではダウンロードしたzip形式の圧縮ファイルを1回クリックしただけで解凍できたのですが、なにかをしてからなのか(XP高速化のソフトを入れてから?)、同じように1回クリックをすると、圧縮ファイルの中身が表示されるだけで解凍できません。右クリックで「展開する」を選べばウィンドウが出てきて解凍できます。しかし今の状態では手間がかかって不便なので前のようにしたいです。なにか設定方法があるのでしょうか?解凍お願いします。

  • zip圧縮をしてもzipファイルが出力されません

    zip圧縮をしてもzipファイルが出力されず困っています。 OSはwindows7 64bitです。 右クリック→送る→圧縮 というwindows7の標準機能を使えばzipファイルが出力されるのですが、 「Lhaplus」を使って圧縮しようとすると、進行状況を表示するウィンドウは出るのですがファイルは出力されません。 zipの他にlzh、bh、tar、tar.bz2、tar.gzなどもうまくいきません。 試した他の形式や、解凍はうまくいきます。 他のソフトの「+Lhaca」で圧縮してみるとLHA形式では出力出来ますが、zip形式では「Lhaplus」のように進行状況は表示されるもののその後ソフト自体が終了してしまい出力されません。 再インストール等も試してみましたが結果は変わりませんでした。 解決法はないでしょうか? よろしくお願いいたします。

  • Windows XpでZip圧縮

    Windows初心者です。 WIndowsは標準でZipの解凍ができますが データをZip圧縮する場合は標準の機能でできるのでしょうか?

  • ZIP圧縮やLHA圧縮されたファイルをプラグインにしたい

    ZIP型式やLHA型式で圧縮されたファイルをUNZIP32.DLLやUNLHA32.DLLで、プログラムのプラグインとしてつかう為には、どんな関数を使えば良いのでしょうか? 宜しければご教授ください。

  • Windows 7 標準のZip解凍が出来ない

     Windows 7 のエクスプローラでZipファイルをダブルクリックしても解凍出来ないし、エクスプローラの右クリックメニュー(コンテキストメニュー)で「すべて展開(T)」が表示されない。  前に、フリーの解凍ソフトを何種類かインストールしたのが原因かと思うのですが、現在は、フリーのソフトは、すべてアンインストールしてあります。  Webページを参考に「regedit」でエクスプローラの「.Zip」を削除してみたのですが戻りません。  エクスプローラからZip形式への圧縮は行えます。(自分で圧縮したZipファイルも同じく解凍できません。)  Windows 7 標準のZip解凍が出来るようにするにはどうすれば良いでしょうか。  ご教授下さい。