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