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
}
}