ZIP-Archive

Mit ZIP-Archiven können mehrere Dateien in einem einzigen Paket komprimiert werden. Dieses Archiv ist kleiner als die Dateien, aus denen es besteht. Hierdurch wird eine effizientere Speicherung der Dateien ermöglicht. Das Archiv selbst kann als eine einzelne Datei übertragen werden.

Erstellen eines ZIP-Archivs und Hinzufügen von Dateien

Wenn Sie ein ZIP-Archiv erstellen möchten, verwenden Sie die Methode addFile der ZipWriter-Komponente, um eine bestimmte Datei in das Archiv zu schreiben. Hierbei gibt die Eigenschaft path den Speicherort des ZIP-Archivs an. Die ZIP-Datei ist erst vorhanden, wenn mindestens eine Datei hinzugefügt wurde. Das Archiv wird dann erstellt und enthält bereits die Datei. In diesem Codebeispiel werden die Dialogfelder "Datei" verwendet, um die Eigenschaft path anzugeben.

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();
    }
}

Der Komprimierungsgrad einer Datei, die einem ZIP-Archiv hinzugefügt wird, ist ausschließlich vom Dateityp abhängig. Textdateien, die von mehreren AppFramework-Komponenten verwendet und erstellt werden, können auf unter 10 Prozent ihrer ursprünglichen Größe komprimiert werden. Dateien, die in bereits hoch komprimierten Formaten vorliegen (beispielsweise JPG-Dateien für Fotos), werden hingegen nicht wesentlich verkleinert. Wenn die komprimierte Größe des Archivs bekannt sein muss, kann mit der Eigenschaft compressedSize der ZipFileInfo-Komponente die Größe einer Datei innerhalb des Archivs angegeben und mit der von der Eigenschaft size bereitgestellten unkomprimierten Größe verglichen werden.

Zum Erstellen von Unterordnern im ZIP-Archiv übergeben Sie den vollständigen Dateipfad des Unterordners, in dem die Dateien enthalten sein sollen, als zweiten Parameter an die Methode addFile. Beispielsweise wird durch Aufruf der Methode als addFile(example.png,~/Images/example.png) dem Archiv die Datei im Unterordner "Images" hinzugefügt, der erstellt wird, falls er noch nicht vorhanden ist.

Lesen von Dateien aus einem Archiv

Die Möglichkeiten von AppFramework, Inhalt aus einem Archiv zu lesen, ohne dieses zu extrahieren, sind begrenzt. Nur der Inhalt von Text- und JSON-Dateien kann mithilfe der Eigenschaft readTextFile bzw. readJsonFile der ZipReader-Komponente gelesen werden.

Mit diesem Codebeispiel, das eine Abänderung des obigen Beispiels für die Archiverstellung ist, wird der Inhalt einer bestimmten Textdatei aus dem ausgewählten ZIP-Archiv gedruckt. Wenn diese Textdatei leer oder nicht vorhanden ist, ist der Textbereich leer.

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
}

Wenn Sie andere Dateien in dem ZIP-Archiv lesen und verwenden möchten, müssen diese zuerst aus dem Archiv extrahiert werden. ZipReader stellt hierzu eine extractFile-Methode für bestimmte Dateien sowie eine extractAll-Methode für das gesamte Archiv bereit.

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