ねらわれたぴらにあ

MENU

【DotNetZip】MemoryStreamに対して入出力する方法【VB】

f:id:gakigaki077:20190324212703p:plain
今回説明するのは

  • 対象フォルダに格納されたファイルのパスをリストとして取得
  • DotNetZipでファイルをZIP化
  • ZIP化したファイルをメモリストリームに書き込む
  • メモリストリームからZIPファイルを読み出す

方法となります。




DotNetZip|メモリストリームに対して入出力する方法

まず、全体のソースがこちら。

        '対象フォルダのファイルパスリストを取得
        Dim filePathlist As String()
        '第1引数はZIP対象が格納されたフォルダパス
        filePathlist = System.IO.Directory.GetFiles("C:\~~",
                                                    "*.txt", System.IO.SearchOption.AllDirectories)

        'ZipFileを作成する 
        Using zip As New Ionic.Zip.ZipFile()

            'エンコード 
            zip.ProvisionalAlternateEncoding = System.Text.Encoding.GetEncoding("shift_jis")

            'ファイルをzipに追加する
            For Each item As String In filePathlist
                zip.AddFile(item)
            Next

            'メモリストリームに保存
            Dim ms As New MemoryStream
            zip.Save(ms)

            'メモリストリームから書き出す
            '第1引数は書き出し先のファイルパスとファイル名
            Using fs As New FileStream("C:\~~\test.zip", FileMode.Create)
                ms.Seek(0, SeekOrigin.Begin)
                ms.CopyTo(fs)
            End Using

        End Using

対象フォルダに格納されたファイルのパスをリストとして取得

        '対象フォルダのファイルパスリストを取得
        Dim filePathlist As String()
        '第1引数はZIP対象が格納されたフォルダパス
        filePathlist = System.IO.Directory.GetFiles("C:\~~",
                                                    "*.txt", System.IO.SearchOption.AllDirectories)

System.IO.Directory.GetFilesの第2引数を"*"とすると、すべてのファイルが対象となります。

DotNetZipでファイルをZIP化

        'ZipFileを作成する 
        Using zip As New Ionic.Zip.ZipFile()

            'エンコード 
            zip.ProvisionalAlternateEncoding = System.Text.Encoding.GetEncoding("shift_jis")

            'ファイルをzipに追加する
            For Each item As String In filePathlist
                zip.AddFile(item)
            Next

上記手順で取得したファイルパスをAddFileでZIPに追加します。

ZIP化したファイルをメモリストリームに書き込む

            'メモリストリームに保存
            Dim ms As New MemoryStream
            zip.Save(ms)

前置きが長くなりましたが、メモリストリームに書き込みのはたったこれだけです。
ちなみに、zip.Save(ms)の引数をファイルパスとファイル名に置き換えると、
メモリストリームではなく、指定の場所にZIPファイルが作成されます。

メモリストリームからZIPファイルを読み出す

            'メモリストリームから書き出す
            '第1引数は書き出し先のファイルパスとファイル名
            Using fs As New FileStream("C:\~~\test.zip", FileMode.Create)
                ms.Seek(0, SeekOrigin.Begin)
                ms.CopyTo(fs)
            End Using

ZIPの書き出し先のファイルパスとファイル名を渡したFileStreamをNewし、
メモリストリームからファイルストリームにCopyToすることで
ZIPファイルが実体として書き出されます。

別の出力方法
            ms.Seek(0, SeekOrigin.Begin)
            ms.Flush()

            Using msZip As Ionic.Zip.ZipFile = Ionic.Zip.ZipFile.Read(ms)
                msZip.Save("C:\~~\test.zip")
            End Using

また、上記のような書き方でも出力することができます。
こちらはDotNetZipのSaveメソッドを使用しています。