أرشيف ZIP

يمكن استخدام أرشيف ZIP لمقارنة عدد من الملفات في حزمة مفردة. يتمتع هذا الأرشيف بحجم ملف أصغر من الملفات التي يتضمنها؛ مما يتيح تخزين الملفات بشكل أكثر كفاءة، ويمكن نقل الأرشيف نفسه كملف مفرد.

إنشاء أرشيف ZIP والإضافة إليه

لإنشاء أرشيف ZIP، استخدم طريق مكون ZipWriter addFile لكتابة ملف محدد فيه، مع خاصية path تصف موقع أرشيف ZIP. لن يتواجد ملف 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.

يمكن إنشاء المجلدات الفرعية في أرشيف ZIP من خلال توفير مسار الملف الكامل لمكان الملف في الأرشيف كمعلمة ثانية لطريقة addFile. على سبيل المثال، سيؤدي استدعاء الطريقة كـ addFile(example.png,~/Images/example.png) إلى إضافة الملف إلى الأرشيف بداخل مجلد فرعي للصور، وإنشاء ملف منه غير موجود بالفعل.

قراءة الملفات من الأرشيف

يوجد لدى AppFramework وسائل محدودة للقراءة من الأرشيف دون استخراجه، ولا يمكنه إلا قراءة محتويات النص وملفات JSON باستخدام خاصيتي readTextFile وreadJsonFile على التوالي لمكون ZipReader.

تطبع عينة الكود والذي تم تعديلها من عينة إنشاء الأرشيف أعلاه محتويات ملف نص محدد من أرشيف 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
    }
}