Los archivos ZIP pueden usarse para comprimir varios archivos en un solo paquete. Este archivo ZIP tiene un tamaño de archivo menor que el de los archivos que lo componen, lo cual permite un almacenamiento de archivos más eficaz y que el propio archivo ZIP pueda transferirse como un único archivo.
Crear y agregar a un archivo ZIP
Para crear un archivo ZIP, utilice el método addFile del componente ZipWriter para escribir un archivo concreto en él, donde la propiedad path describe la ubicación del archivo ZIP. El archivo ZIP no existirá hasta haber agregado al menos un archivo, momento en el que el archivo se creará con el archivo ya en él. Esta muestra de código utiliza diálogos de archivo para informar sobre la propiedad 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();
}
}
El tipo de archivo determina completamente cuánto se comprime un archivo cuando se agrega a un archivo ZIP. Los archivos de texto, utilizados y creados por varios componentes de AppFramework, se pueden comprimir hasta menos del 10 por ciento de su tamaño original; los archivos que ya tienen formatos muy comprimidos (por ejemplo, archivos JPG para imágenes) no reducirán considerablemente el tamaño. Si es importante saber el tamaño del archivo comprimido, el componente ZipFileInfo cuenta con una propiedad, compressedSize, que proporciona el tamaño de un archivo dentro del archivo ZIP para compararlo con el tamaño sin comprimir ofrecido por la propiedad size.
Se pueden crear subcarpetas en el archivo ZIP proporcionando la ruta de archivo completa donde estarán los archivos en el archivo como un segundo parámetro para el método addFile. Por ejemplo, invocar al método como addFile(example.png,~/Images/example.png) agregará el archivo dentro del archivo de una subcarpeta Imágenes, o creando una si no existe.
Leer archivos desde un archivo ZIP
Las capacidades de AppFramework para leer un archivo sin extraerlo son limitadas; únicamente puede leer los contenidos de los archivos de texto y JSON con las propiedades readTextFile y readJsonFile, respectivamente, del componente ZipReader.
Esta muestra de código, modificada a partir de la muestra de más arriba para crear un archivo, imprime el contenido de un archivo de texto concreto de un archivo ZIP seleccionado. Si este archivo de texto está vacío o no está presente, el área de texto estará en blanco.
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
}
Para leer y usar otros archivos del archivo ZIP, primero se deben extraer los archivos del archivo ZIP. Para ello, ZipReader ofrece un método extractFile para archivos concretos, así como un método extractAll para todo el archivo ZIP.
// 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
}
}