Archives ZIP

Les archives ZIP permettent de compresser des fichiers en un seul paquetage. Cette archive a une taille plus petite que les fichiers qu'elle contient, ce qui permet de stocker les fichiers plus efficacement, tandis que l'archive elle-même peut être transférée comme un seul et même fichier.

Création d'une archive ZIP et ajout d'éléments dans cette archive

Pour créer une archive ZIP, utilisez la méthode addFile du composant ZipWriter afin d'écrire un fichier spécifique dans cette archive, avec la propriété path décrivant l'emplacement de l'archive ZIP. Le fichier ZIP n'existera que si au moins un fichier y a été ajouté, auquel cas l'archive sera créée contenant déjà le fichier. Cet exemple de code utilise des boîtes de dialogue de fichier pour informer la propriété 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();
    }
}

Le degré de compression d'un fichier lorsqu'il est ajouté à une archive ZIP dépend entièrement du type de fichier. Les fichiers texte, qui sont utilisés et créés par des composants AppFramework, peuvent être compressé à moins de 10 % de leur taille d'origine, tandis que les fichiers se trouvant déjà dans des formats hautement compressés (par exemple, les fichiers JPG de photo) ne diminueront pas considérablement en taille. S'il est important de connaître la taille compressée de l'archive, le composant ZipFileInfo comporte une propriété compressedSize qui retourne la taille d'un fichier dans l'archive à comparer à la taille non compressée indiquée par la propriété size.

Il est possible de créer des sous-dossiers dans l’archive ZIP en fournissant le chemin d’accès complet aux fichiers dans l’archive en tant que second paramètre de la méthode addFile. Par exemple, nommer la méthode addFile(example.png,~/Images/example.png) ajoutera le fichier dans un sous-dossier Images à l’intérieur de l’archive, créant ce sous-dossier si celui-ci n’existe pas.

Lecture de fichiers depuis une archive

AppFramework dispose de moyens limités pour lire à partir d'une archive sans l'extraire ; il peut uniquement lire le contenu de fichiers texte et JSON à l'aide des propriétés readTextFile et readJsonFile, respectivement, du composant ZipReader.

Cet exemple de code, modifié à partir de l'exemple de création d'archive ci-dessus, imprime le contenu d'un fichier texte spécifique à partir de l'archive ZIP sélectionnée. Si ce fichier texte est vide ou absent, la zone de texte sera vide.

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
}

Pour lire et utiliser d'autres fichiers de l'archive ZIP, ceux-ci doivent d'abord en être extraits. Pour ce faire, ZipReader fournit une méthode extractFile pour les fichiers spécifiques, ainsi qu'une méthode extractAll pour toute l'archive.

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