- PR -

java.util.zip.ZipEntryを使用して空フォルダの圧縮方法について

投稿者投稿内容
馬鹿者><
会議室デビュー日: 2007/11/29
投稿数: 9
投稿日時: 2008-08-08 11:10
お世話になります。
ZIP圧縮の空フォルダの圧縮方法についてお聞きしたいのですが

過去ログに
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=16516&forum=12&4
があり、空フォルダの圧縮が可能であることはわかりましたが
具体的なソースコードがわかりません。

ご教授お願いいたします。

WindowsXP、VS2005です。

Dim lo_fos As New java.io.FileOutputStream("ZIP出力先パス") 'ZipOutputStreamの作成
Dim lo_zos As New java.util.zip.ZipOutputStream(lo_fos)


Dim ls_Dir As String = "C:\TEST\B\"
    ↑Bフォルダ(フォルダ内は空)を圧縮したい

Dim ls_F As String = ls_Dir
ls_F = ls_F.Replace("\", "/")
Dim ze As New java.util.zip.ZipEntry(ls_F)
ze.setMethod(java.util.zip.ZipEntry.DEFLATED)
lo_zos.putNextEntry(ze)

Dim lo_fis As New java.io.FileInputStream(ls_F)
    ↑ここでエラーになります。
    そもそもフォルダなのでFileInputStream自体が間違いなのかな?

Dim buffer(8191) As System.SByte
While True
Dim len As Integer = lo_fis.read(buffer, 0, buffer.Length)
If len <= 0 Then
Exit While
End If
lo_zos.write(buffer, 0, 0)
End While
lo_fis.close()
lo_zos.closeEntry()
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-08-08 12:00
引用:

馬鹿者><さんの書き込み (2008-08-08 11:10) より:

そもそもフォルダなのでFileInputStream自体が間違いなのかな?


そうですね。 java.util.zip.ZipEntry のコンストラクタで '/' で終わるディレクトリ名を指定するだけで良いです。 あとはファイルと同じ要領になります。

# zip の閲覧時はこれだけだとダメかな。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
馬鹿者><
会議室デビュー日: 2007/11/29
投稿数: 9
投稿日時: 2008-08-08 13:16
じゃんぬねっとさん回答ありがとうございます。

>そうですね。 java.util.zip.ZipEntry のコンストラクタで '/' で終わるディレクト>リ名を指定するだけで良いです。
>あとはファイルと同じ要領になります。

ということは、最初に記載した構文でいいということでしょうか?
実行してみるとやはり以下の部分でエラーが発生してしまいます。
(フォルダはちゃんと存在しているフォルダを指定しています・・)

>Dim lo_fis As New java.io.FileInputStream(ls_F)
>    ↑ここでエラーになります。



[ メッセージ編集済み 編集者: 馬鹿者>< 編集日時 2008-08-08 13:24 ]
馬鹿者><
会議室デビュー日: 2007/11/29
投稿数: 9
投稿日時: 2008-08-08 13:20
あっすいません、ちなみにエラーは
FileNotFoundExcepctionはハンドルされませんでした。
でした。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-08-08 13:30
引用:

馬鹿者><さんの書き込み (2008-08-08 13:16) より:

ということは、最初に記載した構文でいいということでしょうか?


すみません、私の 'そうですね' に係る言葉は "FileInputStream自体が間違い" になります。 ファイルではないのですから読み取れないですし、ディレクトリに何か内容が含まれるわけではないのでそもそも読み取る必要がないですよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-08-08 14:18
自分で読んでいてもわかりにくいと思ったので単刀直入に書きます。
  • ZipEntry に登録するファイル名の末尾を "/" として isDirectory メソッドの戻り値が True になっていることを確認する。
  • データは書き込む必要はなく、そのまま ZipOutputStream.closeEntry メソッドで ZipEntry を閉じる。
この方法で空のディレクトリ単体で試してみると良いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
馬鹿者><
会議室デビュー日: 2007/11/29
投稿数: 9
投稿日時: 2008-08-08 14:24
じゃんぬねっとさん何度もありがとうございます。
なるほどファイルなので読み取る必要ないということですね

writeの方法がわかりませんでしたが、0バイト指定でやればできました。
ありがとうございました。

Dim lo_fos As New java.io.FileOutputStream("ZIP出力先パス") 'ZipOutputStreamの作成
Dim lo_zos As New java.util.zip.ZipOutputStream(lo_fos)
Dim ls_Dir As String = "C:\TEST\B\"
    ↑Bフォルダ(フォルダ内は空)を圧縮したい

Dim ls_F As String = ls_Dir
ls_F = ls_F.Replace("\", "/")
Dim ze As New java.util.zip.ZipEntry(ls_F)
ze.setMethod(java.util.zip.ZipEntry.DEFLATED)
lo_zos.putNextEntry(ze)
lo_zos.write(0)
lo_fis.close()
lo_zos.closeEntry()
馬鹿者><
会議室デビュー日: 2007/11/29
投稿数: 9
投稿日時: 2008-08-08 15:17
じゃんぬねっとさん回答ありがとうございます。

>writeの方法がわかりませんでしたが、0バイト指定でやればできました。
>ありがとうございました。
おおうそでした><
ZIPファイルではなく圧縮前のフォルダをみてました(おおぼけ)

以下のソースで試してみました。
isDirectory はTrueが返却されました。
でCloseEntryで閉じてできたZIPをみてみましたが、フォルダがありません><
どこか間違っていますでしょうか・・・

Dim ls_Dir As String = "D:\TEST\B\"
Dim ls_F As String = ls_Dir

ls_F = ls_F.Replace("\", "/")
Dim ze As New java.util.zip.ZipEntry(ls_F)
ze.setMethod(java.util.zip.ZipEntry.DEFLATED)
lo_zos.putNextEntry(ze)
If ze.isDirectory = True Then
lo_zos.closeEntry()
End If
lo_zos.close()
lo_fos.close()

追加です。
できない原因がわかりました。
フルパスでやってたからみたいでした。

で一応追加されたのですが、フォルダではなくファイルになってしまいました><


[ メッセージ編集済み 編集者: 馬鹿者>< 編集日時 2008-08-08 15:34 ]

さらに追加
ZIP内を見てみるとファイルと表示されていますが展開してみるとフォルダになっていました。
これで問題はないのでしょうか?


[ メッセージ編集済み 編集者: 馬鹿者>< 編集日時 2008-08-08 15:40 ]

スキルアップ/キャリアアップ(JOB@IT)