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
}
}
Vous avez un commentaire à formuler concernant cette rubrique ?