Archivi ZIP

È possibile usare gli archivi ZIP per comprimere più file in un solo pacchetto. Questo archivio ha una dimensione inferiore rispetto ai file che comprende, consentendo un'archiviazione più efficiente dei file e il trasferimento dell'archivio stesso come file singolo.

Creare un archivio ZIP e aggiungere file

Per creare un archivio ZIP, usare il metodo addFile del componente ZipWriter per scrivervi un file specifico, utilizzando la proprietà path per descrivere la destinazione dell'archivio ZIP. Il file ZIP non esisterà fino a quando non si completa l'aggiunta di almeno un file, momento in cui si crea l'archivio con il file già inserito. Questo esempio di codice usa le finestre di dialogo del file per informare la proprietà 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();
    }
}

Il grado di compressione di un file che viene aggiunto ad un archivio ZIP dipende completamente dal tipo di file. I file di testo, usati e creati da una serie di componenti AppFramework, possono essere compressi fino a meno del 10% delle loro dimensioni originali, mentre nei file che già presentano dei formati altamente compressi (ad esempio, i file JPG per le foto) la differenze sarà meno considerevole. Se è importante conoscere le dimensioni compresse dell'archivio, il componente ZipFileInfo dispone di una proprietà compressedSize che riporta le dimensioni di un file all'interno di un archivio per paragonarle alle dimensioni non compresse fornite dalla proprietà size.

Le sottocartelle possono essere create nell'archivio ZIP fornendo il percorso completo del file in cui i file si troveranno nell'archivio come secondo parametro del metodo addFile. Ad esempio, chiamando il metodo addFile(example.png,~/Images/example.png) si aggiunge il file nell'archivio all'interno di una sottocartella Immagini, creandone una, se non esiste già.

Leggere i file dall'archivio

AppFramework dispone di mezzi limitati per la lettura da un archivio senza estrarre i file; può solo leggere il contenuto di file di testo e JSON usando, rispettivamente, le proprietà readTextFile e readJsonFile del componente ZipReader.

Questo esempio di codice, diverso rispetto all'esempio precedente per la creazione di un archivio, stampa il contenuto di un file di testo specifico dall'archivio ZIP selezionato. Se questo file di testo è vuoto o non esistente, l'area di testo sarà vuota.

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
}

Per leggere e usare altri file nell'archivio ZIP, i file devono prima essere estratti dall'archivio. A tal fine, ZipReader fornisce un metodo extractFile per file specifici, nonché un metodo extractAll per l'intero archivio.

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