ZIP 아카이브

ZIP 아카이브를 사용하면 여러 파일을 단일 패키지로 압축할 수 있습니다. 이 아카이브는 아카이브를 구성하는 파일보다 크기가 작으므로 파일을 더욱 효율적으로 저장할 수 있으며, 아카이브 자체를 단일 파일로 전송할 수 있습니다.

ZIP 아카이브 생성 및 추가

ZIP 아카이브를 생성하려면 ZipWriter 컴포넌트 addFile 메소드를 사용하여 아카이브에 특정 파일을 쓰고 ZIP 아카이브의 위치를 설명하는 path 속성을 포함합니다. ZIP 파일은 파일을 하나 이상 추가할 때까지는 생성되지 않습니다. 즉, 파일을 추가하면 이미 파일이 포함된 상태의 아카이브가 생성됩니다. 이 코드 샘플은 파일 대화 상자를 사용하여 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();
    }
}

ZIP 아카이브에 추가할 때 파일이 압축되는 정도는 전적으로 파일 형식에 따라 달라집니다. 여러 AppFramework 컴포넌트에서 사용 및 생성되는 텍스트 파일은 기존 크기의 10% 미만으로 압축할 수 있는 반면, 사진용 JPG 파일과 같이 이미 고도로 압축된 형식의 파일은 크기가 많이 줄어들지는 않습니다. 아카이브의 압축된 크기를 확인해야 하는 경우를 위해, ZipFileInfo 컴포넌트에는 compressedSize 속성이 반환하는 압축 해제된 크기와 비교할 수 있도록 아카이브 내의 파일 크기를 반환하는 size 속성이 포함되어 있습니다.

하위폴더는 파일이 아카이브에 있는 전체 파일 경로를 addFile 메소드에 대한 두 번째 매개변수로 제공하여 ZIP 아카이브에 생성될 수 있습니다. 예를 들어, 메소드를 addFile(example.png,~/Images/example.png)로 호출하면 파일이 이미지 하위폴더의 내부 아카이브에 추가되고 아직 없는 하위폴더 중 하나가 생성됩니다.

아카이브의 파일 읽기

AppFramework에서는 제한적인 방식으로 아카이브를 추출하지 않고도 아카이브에서 파일을 읽을 수 있습니다. 즉, ZipReader 컴포넌트의 readTextFilereadJsonFile 속성을 각각 사용하여 텍스트 파일과 JSON 파일의 콘텐츠만 읽을 수 있습니다.

위의 아카이브 생성용 샘플에서 수정된 이 코드 샘플은 선택한 ZIP 아카이브의 특정 텍스트 파일 콘텐츠를 인쇄합니다. 이 텍스트 파일이 비어 있거나 없으면 텍스트 영역은 비어 있게 됩니다.

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
}

ZIP 아카이브의 다른 파일을 읽고 사용하려면 아카이브에서 해당 파일을 추출해야 합니다. ZipReader는 이러한 작업을 위해 특정 파일용 extractFile 메소드와 전체 아카이브용 extractAll 메소드를 모두 제공합니다.

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