FreeBASIC マニュアルのトップに戻る

FreeBASIC ExtLibZip

目次→その他→ライブラリ・ヘッダー索引libzip←オリジナル・サイト
目次→FreeBASIC のハッキング→FreeBASIC でのハッキングのための情報外部ライブラリ索引libzip←オリジナル・サイト

libzip


.zipアーカイブを、作成・読む・修正するための、使いやすいライブラリ。

ウエブ・サイト: https://libzip.org
Github: https://github.com/nih-at/libzip
利用できる環境: Win32, Linux, DOS
include するヘッダー: zip.bi
ヘッダー・バージョン: 0.11.2
使用例: examples/compression/

事前準備
'libz.a' は、下記
http://users.freebasic-portal.de/stw/builds/
の win32_mingw_additional_libs.zip に有ります。

例:
'' libzip を使って .zip を解凍
#include once "zip.bi"

Sub create_parent_dirs(ByVal file As ZString Ptr)
    '' 以下のようにパスを指定:
    ''    foo/bar/baz/file.ext
    '' これらの mkdir() を実行:
    ''    foo
    ''    foo/bar
    ''    foo/bar/baz
    Dim As UByte Ptr p = file
    Do
        Select Case (*p)
        Case Asc("/")
            *p = 0
            MkDir(*file)
            *p = Asc("/")
        Case 0
            Exit Do
        End Select
        p += 1
    Loop
End Sub

'' libzip に .zip ファイルのファイル番号の情報をあたえる
'' そして、必要なディレクトリを作成して、これを実行する
Private Sub unpack_zip_file(ByVal zip As Any Ptr, ByVal i As Integer)
    #define BUFFER_SIZE (1024 * 512)
    Static As UByte chunk(0 To (BUFFER_SIZE - 1))
    #define buffer (@chunk(0))

    '' ファイル名を検索する
    Dim As String filename = *zip_get_name(zip, i, 0)
    Print "file: " & filename & ", ";

    '' zip_stat() を使ってファイル・サイズを検索する
    Dim As zip_stat stat
    If (zip_stat_index(zip, i, 0, @stat)) Then
        Print "zip_stat() failed"
        Return
    End If

    If ((stat.valid And ZIP_STAT_SIZE) = 0) Then
        Print "could not retrieve file size from zip_stat()"
        Return
    End If

    Print stat.size & " bytes"

    '' 必要ならディレクトリを作成
    create_parent_dirs(filename)

    '' ファイルを書き出す
    Dim As Integer fo = FreeFile()
    If (Open(filename, For Binary, Access Write, As #fo)) Then
        Print "could not open output file"
        Return
    End If

    '' libzip から来るファイルを入力する
    Dim As Any Ptr fi = zip_fopen_index(zip, i, 0)
    Do
        '' zip_fread() から返されるファイルの内容を書き出す
        '' これは、デコードとすべてを行う
        '' zip_fread() は、バッファを埋める
        Dim As Integer bytes = _
            zip_fread(fi, buffer, BUFFER_SIZE)
        If (bytes < 0) Then
            Print "zip_fread() failed"
            Exit Do
        End If

        '' EOF?
        If (bytes = 0) Then
            Exit Do
        End If

        '' ファイルのバイト量 <bytes> を書く
        If (Put(#fo, , *buffer, bytes)) Then
            Print "file output failed"
            Exit Do
        End If
    Loop

    '' 完了
    zip_fclose(fi)
    Close #fo
End Sub

Sub unpack_zip(ByRef archive As String)
    Dim As Any Ptr zip = zip_open(archive, ZIP_CHECKCONS, NULL)
    If (zip = NULL) Then
        Print "could not open input file " & archive
        Return
    End If

    '' .zip の各ファイルについて ... (本当に良い API, ありがとう libzip)
    For i As Integer = 0 To (zip_get_num_entries(zip, 0) - 1)
        unpack_zip_file(zip, i)
    Next

    zip_close(zip)
End Sub


    unpack_zip("test.zip")



'' libzipを使った.zip 圧縮
#include "zip.bi"

Sub zipAddFileFromString(ByVal fname As ZString Ptr, ByVal id_d As ZString Ptr, ByVal myData As ZString Ptr)
    Dim As Any Ptr pzo
    Dim As Any Ptr pzsb
   
    pzo = zip_open(fname, ZIP_CREATE, 0)
    If pzo = 0 Then End
   
    pzsb = zip_source_buffer(pzo, myData, Len(*myData), 0)
    If pzsb = 0 Then End
   
    zip_file_add(pzo, id_d, pzsb, ZIP_FL_OVERWRITE)
    zip_close(pzo)
   
    Print "OK"
End Sub

Dim As String mytext, myzipfile, myfile

myText    = "<My text           >......6...3..2"
myZipFile = "26.zip"
myFile    = "file3.txt"

zipAddFileFromString(myZipFile, myFile, myText)

myFile    = "BIMBO/file3.txt"
zipAddFileFromString(myZipFile, myFile, myText)

Sleep


外部ライブラリー目次に戻る

ページ歴史:2020-12-31 14:24:11
日本語翻訳:WATANABE Makoto、原文著作者:DkLwikki

ホームページのトップに戻る

表示-非営利-継承