[[20190612110348]] 『圧縮の自動化 FileSystemObjectについて』(しのみや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『圧縮の自動化 FileSystemObjectについて』(しのみや)

 https://officeforest.org/wp/2019/04/05/vbaでzipの圧縮・解答をやらせてみる/
 のページの「圧縮をしてみる」の記述をお借りしています。
 (動作は問題なく動いております)

 上記の記述の中でよくわからない部分がありましたので、質問させてください。
 (FileSystemObjectの使い方を勉強中です)

 '空のzipファイルを生成
     With FSO.CreateTextFile(ZipPath, True)
         .Write "PK" & Chr(5) & Chr(6) & String(18, 0)
         .Close
     End With

 CreateTextFile … テキストファイルを新規作成する場合に使用
 .Write … 文字列の書き込み

 まではわかったのですが、"PK" & Chr(5) & Chr(6) & String(18, 0)とは
 どこに何を書き込んでいるのでしょうか?

 デバッグして、.Close後のzipの中身を見てみましたが何も書かれていないようです。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


出来上がったファイルは、バイナリエディタで見てみてください。 テキストエディタでは、文字が割り当てられていないコードは見えませんから。

そして、ZIPファイルフォーマットについて調べておくべきです。 wikiとかにあります。 ちなみに、先頭4バイトでZIP形式ファイルである事を表しています。 普通は"PK" & Chr(3) & Chr(4) ですが(ちなみに、xlsxなんかもこれ)、5,6ということは、セントラルディレクトリエントリと呼ばれる構造ですね。
(???) 2019/06/12(水) 11:35


もうちょっと理解が深まる事を書いてみます。

デバッグして、という日本語は変ですが、おそらく "PK" & Chr(5) & Chr(6) & String(18, 0) をファイルに書き込んでCloseしたところで、マクロを止めてみたのでしょうか。 サイズ22バイトのファイルができあがっていたはずです。(バイナリエディタで作成してもOK)

次に、エクスプローラ上で、作成した22バイトのファイル(拡張子はZIP)をダブルクリックしてみてください。 ただのバイナリファイルだったのに、フォルダを1階層降りたような表示になる事でしょう。

つまり、作成した22バイトのファイルは、中身が空のZIPファイルそのものだった訳ですね。 後はこの中に圧縮したいファイルをコピーしている、という事です。

(???) 2019/06/12(水) 12:00


 ありがとうございます
 新しい情報を得てWebで調べてふわふわした状態ですが…

 バイナリエディタが社内にないので、テキストで開いてみました。
 「PK                  」こんなものが書き込まれていました。
 バイナリで見ると、もう少し判別できる情報が入っているのかなぁと思います…

 バイナリエディタで「PK                  」の情報を頭においてzipで保存すれば
 zipフォルダができあがるということかな…

 テキストで試して、作成されたzip開こうとすると
 「フォルダーを開くことができません。圧縮(zip形式)フォルダーは無効です。」となりました。

 >デバッグして、という日本語は変ですが
 たしかに変ですね^^;
(しのみや) 2019/06/13(木) 10:18

バイナリエディタはとても便利なのですが、会社ルールでフリーウェア系が禁止されているのであれば、Windows10に標準装備されているPowerShellを使ってみてはどうでしょうか。 編集は難しいですが、16進表示するだけなら簡単にできます。
 ・WIN+Xを押す。
 ・「Windows PowerShell」を選択。
 ・fhx c:\tmp\test.zip > c:\tmp\text.txt のように入力し、ENTER。
 (動かしてみるだけなら、「fhx c:\tmp\test.zip」で良い)
 ・結果が c:\tmp\text.txt に書き出されるので、これをエディタで開く。
(???) 2019/06/14(金) 09:54

 ありがとうございます
 Windows PowerShellが初耳でして先ほど調べた状態でアレなんですが…

 Windows PowerShellを開くと
 PS C:\Users\*************> となっております。

 試したこと
 ☆1
 PS C:\Users\*************> u:\test.zip
 でEnterしたところ、エクスプローラでzipが開きます。

 ☆2
 PS C:\Users\*************> u:\test.txt
 でEnterしたところ、メモ帳が開きます。

 ☆3
 PS C:\Users\*************> fhx
 でEnterしたところ、
 用語'fhx'は、コマンドレット、関数、スクリプトファイル、
 または操作可能なプログラムの名前として認識されません。
 正しく記述されていることを… の赤字が出ます。

 なにがなんだかそもそも理解できていないので…ハテナです スミマセン
(しのみや) 2019/06/14(金) 12:17

 こんにちは。

 16進ダンプの結果をみるだけなら、コマンドプロンプトで
   certutil -dump ファイル名 
 という手もありますよ。

 ???さんが書いているとおり
 >つまり、作成した22バイトのファイルは、中身が空のZIPファイルそのものだった訳ですね。
 >後はこの中に圧縮したいファイルをコピーしている、という事です。

 なのですが、エクスプローラーの右クリックの新規作成で、
 圧縮(zip形式)ファルダーを作成すると、

 >With FSO.CreateTextFile(ZipPath, True)
 >  .Write "PK" & Chr(5) & Chr(6) & String(18, 0)
 >  .Close
 >End With 

 で作ったのと同じファイルが出来るわけですが、
 実験してみたところ、拡張子が.ZIPであれば、中身は空(0byte)でも大丈夫のようです。

 VBAで
  Open "D:\sample.zip" For Binary As 1
  Close 1
 とすれば、D:\sample.zip をFSOで圧縮フォルダとして扱えます。
(でれすけ) 2019/06/14(金) 12:51

 ありがとうございます
 16進ダンプの結果は確認できました

 確認したところで、
 そういうものなのかぁ…フームの理解になりましたが、
 謎の一文ではなくなったので助かりました

 ありがとうございました
(しのみや) 2019/06/14(金) 14:05

fhxは、Format-Hexのエイリアス(命令を短縮形にしたもの)であり、デフォルト定義してある…、と思ったのですが、違ったかな?、すいません。 でれすけさん紹介のcertutilコマンドで見られたようで、何よりです。 テキストエディタで作ってみて駄目だったファイルも同じように表示すると、中身が全然違うというのが判るでしょう。

びっくりしたのが、サイズ0のファイルでも拡張子が .zip なら、エクスプローラはzipフォルダとして認識してくれるという点。 今どきのWindowsは、そこまで親切になっていたのですねぇ。 ウィルスに悪用されそうな仕様にも思えますが、ファイルを右クリックして「送る」−「圧縮フォルダー」とするより、zip作成が簡単かもですね。
(右クリックから「新規作成」−「圧縮フォルダー」だと、マクロで作ったのと同じ22バイトファイルができます)
(???) 2019/06/14(金) 15:43


 詳しく書いてくださりありがとうございます
 ちょっとわかった気になりました(笑

 ありがとうございました

 既存のファイル(サイズ0ではない)の拡張子をzipに変えると、
 「圧縮(zip形式)フォルダーエラー フォルダーを開くことができません」となるので
 ファイルとしてはNGのようです

 けれども、???さんの仰るように
 サイズ0のファイルの拡張子をzipに変えると、
 zipとしての動きを再現している?ように見えますね

 22バイトの「PK                  」←こういう設定文字がないけど、
 拡張子がzipなのでとりあえずzipにしておきました、みたいのなのでしょうかねぇ…
 (思ったことを書いただけなので、質問ではありません)
(しのみや) 2019/06/18(火) 10:36

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.