[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『圧縮の自動化 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
・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
びっくりしたのが、サイズ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.