Archivos ZIP

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