Arquivos ZIP

O arquivo ZIP pode ser utilizado para compactar diversos arquivos em um pacote único. Este arquivo tem um tamanho menor que os arquivos que os incluem, permitindo que os arquivos sejam armazenados de forma mais eficaz e o arquivo compactado pode ser transferido propriamente como um arquivo único.

Criar e adicionar a um arquivo ZIP

Para criar um arquivo ZIP, utilize o método do componente ZipWriter addFile para gravar um arquivo em particular nele, com a propriedade path descrevendo a localização do arquivo ZIP. O arquivo ZIP não existirá até que pelo menos um arquivo tenha sido adicionado, a que ponto o arquivo será criado com o arquivo já inserido. Esta amostra de código utiliza diálogos de arquivo para informar a propriedade 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();
    }
}

Para saber quanto um arquivo é compactado quando adicionado a um arquivo ZIP depende completamente do tipo do arquivo. Arquivos de texto, que são utilizados e criados por vários componentes do AppFramework, pode ser compactados em menos que 10 porcento de seu tamanho original, enquanto que os arquivos que já estão em formatos altamente compactados (por exemplo, arquivos de JPG para fotos) não irão reduzir consideravelmente em tamanho. Se for importante saber o tamanho do arquivo compactado, o componente de ZipFileInfo tem uma propriedade compressedSize que retorna o tamanho de um arquivo dentro do arquivo compactado para comparar ao tamanho descompactado fornecido pela propriedade size .

As subpastas podem ser criadas no arquivo ZIP, fornecendo o caminho completo do arquivo de onde os arquivos estarão no arquivo como um segundo parâmetro para o método addFile . Por exemplo, solicitar o método como addFile(example.png,~/Images/example.png) adicionará o arquivo no arquivo dentro de uma subpasta de Imagens, criando uma delas que ainda não existe.

Ler os arquivos a partir do arquivo compactado

O AppFramework limitou a leitura de um arquivo compactado sem extrai-lo; ele pode somente ler o conteúdo de texto e arquivos JSON utilizando as propriedades readTextFile e readJsonFile , respectivamente, do componente ZipReader.

Esta amostra de código, modificada a partir da amostra para criar um arquivo acima, imprime o conteúdo de um arquivo de texto específico a partir do arquivo ZIP selecionado. Se este arquivo de texto estiver vazio ou ausente, a área de texto estará em branco.

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 ler e utilizar outros arquivos no arquivo ZIP, os arquivos devem primeiro ser extraídos a partir do arquivo compactado. Para fazer isto, o ZipReader fornece um método extractFile para arquivos específicos, como também um método extractAll para o arquivo compactado inteiro.

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