ZIP アーカイブ

ZIP アーカイブを使用すると、多数のファイルを 1 つのパッケージに圧縮できます。このアーカイブのファイル サイズは、アーカイブ内のファイルよりも小さいので、ファイルをより効率的に保存でき、アーカイブ自体を 1 つのファイルとして転送できます。

ZIP アーカイブの作成と ZIP アーカイブへの追加

ZIP アーカイブを作成するには、ZipWriter コンポーネントの addFile メソッドを使用して特定のファイルを書き込み、ZIP アーカイブの場所を表す path プロパティを使用します。ZIP ファイルは、少なくとも 1 つのファイルが追加されるまでは存在しません。追加された時点で、そのファイルがすでに格納された状態でアーカイブが作成されます。次のサンプル コードは、ファイル ダイアログを使用して path プロパティを通知します。

ZipReader {
    id: zipReader
}
ZipWriter {
    id: zipWriter
}
Grid {
    columns: 2
    spacing: 5
    anchors {
        left: parent.left
        right: parent.right
        top: titleText.bottom
        bottom: parent.bottom
        margins: 10
    }
    Button {
        text: "Path"
        onClicked: {
            fileDialog.open();
        }
    }
    Text {
        text: zipReader.path
    }
    Label {
        text: "Folders"
    }
    ComboBox {
        model: zipReader.folderNames
    }
    Label {
        text: "Files"
    }
    ComboBox {
        model: zipReader.fileNames
    }
    Button {
        text: "Add File"
        onClicked: {
            addFileDialog.open();
        }
    }
}
FileDialog {
    id: fileDialog
    title: "Choose a ZIP archive"
    selectExisting: false
    selectMultiple: false
    nameFilters: [ "ZIP archives (*.zip)", "All files (*)" ]
    onAccepted: {
        console.log("ZIP archive url: " + fileDialog.fileUrl)
        zipReader.path = AppFramework.urlInfo(fileDialog.fileUrl).localFile;
        zipWriter.path = zipReader.path;
    }
}
FileDialog {
    id: addFileDialog
    title: "Choose a file to archive"
    selectExisting: true
    selectMultiple: false
    nameFilters: [ "All files (*)" ]
    onAccepted: {
        console.log("ZIP archive url: " + addFileDialog.fileUrl)
        var path = AppFramework.urlInfo(addFileDialog.fileUrl).localFile;
        zipWriter.addFile(path);
        zipReader.refresh();
    }
}

ZIP アーカイブに追加する際にファイルが圧縮される度合いは、ファイル タイプに完全に依存します。多くの AppFramework コンポーネントで使用および作成されるテキスト ファイルは、元のサイズの 10 パーセント未満に圧縮できます。一方、圧縮率がすでに高い形式のファイル (写真の JPG ファイルなど) は、サイズがそれほど減少しません。アーカイブの圧縮されたサイズを知ることが重要である場合は、ZipFileInfo コンポーネントの compressedSize プロパティを使用します。これはアーカイブ内のファイルのサイズを返し、size プロパティが提供する圧縮されていないサイズと比較できます。

ZIP アーカイブ内でのファイルの場所を示すファイルの絶対パスを addFile メソッドの 2 つ目のパラメーターとして指定することで、ZIP アーカイブ内にサブフォルダーを作成できます。たとえば、addFile(example.png,~/Images/example.png) としてこのメソッドを呼び出すと、Images サブフォルダーがまだ存在しない場合は、そのサブフォルダーが作成され、ファイルがアーカイブのそのサブフォルダー内に追加されます。

アーカイブからのファイルの読み取り

AppFramework で、ファイルを抽出せずにアーカイブから読み取る方法は限られています。テキストおよび JSON ファイルのコンテンツのみを、ZipReader コンポーネントのそれぞれ readTextFile および readJsonFile プロパティを使用して読み取ることができます。

次のサンプル コードは、上記のアーカイブを作成するサンプルを変更したもので、選択した ZIP アーカイブから特定のテキスト ファイルのコンテンツを出力します。このテキスト ファイルが空の場合や存在しない場合、テキスト領域は空白になります。

Button {
    text: "Path"
    onClicked: {
        archiveFileDialog.open();
    }
}
FileDialog {
    id: archiveFileDialog
    title: "Choose a ZIP archive"
    selectExisting: true
    selectMultiple: false
    nameFilters: [ "ZIP archives (*.zip)", "All files (*)" ]
    onAccepted: {
        console.log("ZIP archive url: " + archiveFileDialog.fileUrl)
        zipReader.path = AppFramework.urlInfo(archiveFileDialog.fileUrl).localFile;
        textFileContents.text = zipReader.readTextFile("TestFile.txt")
    }
}
ZipReader {
    id: zipReader
}
TextArea {
    id: textFileContents
}

ZIP アーカイブ内のその他のファイルを読み取ったり使用したりするには、まずファイルをアーカイブから抽出する必要があります。これを実行するために、ZipReader は特定のファイル用に extractFile メソッド、アーカイブ全体用に extractAll メソッドを提供しています。

// Instantiates ZipReader, points path property to preexisting archive
ZipReader {
    id: zipReader
    path: "~/ArcGIS/Example App/Zip archive.zip"
    onError: {
        console.log("Error extracting ", fileName)
    }
    // Creates progress notifications when extraction is ongoing
    onProgress: {
        if(percent == 0)
            resultArea.text +="\n" + "Extracting Next item" +"\n\n"
            resultArea.text +=  ("Extracted- %1 file %2 % at %3 ").arg(fileName).arg(percent).arg(outputFileName) + "\n"
    }
    onCompleted: {
        resultArea.text +=  "\n Extract completed"
    }
}
Column {
    spacing: 10
    Text {
        text: zipReader.path
    }
    Button { //Extracts contents of ZIP archive into a set folder inside app's files
        text: "Click to Extract ZIP File"
        onClicked: {
            zipReader.extractAll("~/Output Folder")
        }
    }
    TextArea { //Text area where progress notifications will display
        id: resultArea
        width: app.width
        height: app.height
    }
}