Swift में ZIP/आर्काइव के साथ काम करना (iOS/macOS): पूरी गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Swift में ZIP-आर्काइव के साथ काम करना (iOS/macOS)

डेटा को कंप्रेस और डीकंप्रेस करना iOS और macOS ऐप डेवलपमेंट की एक अहम ज़रूरत है। ZIP फ़ॉर्मेट अपनी सार्वभौमिकता और Apple ऑपरेटिंग सिस्टम में बिल्ट-इन सपोर्ट के कारण फ़ाइलों को पैक करने का सबसे लोकप्रिय तरीका बना हुआ है। इस लेख में, हम Swift में ZIP आर्काइव के साथ काम करने के दो मुख्य तरीकों पर चर्चा करेंगे: बिल्ट-इन Foundation फ्रेमवर्क और शक्तिशाली थर्ड-पार्टी लाइब्रेरी Zip Foundation का उपयोग।

1. Foundation के बिल्ट-इन साधन (NSFileCoordinator + libz)

iOS 9 और macOS 10.11 से शुरू करके, Apple NSFileCoordinator क्लास और सिस्टम लाइब्रेरी libz के ज़रिए ZIP के लिए सीमित लेकिन बुनियादी कार्यों के लिए पर्याप्त सपोर्ट प्रदान करता है। हालांकि, इस तरीके में थ्रेड्स को मैन्युअली मैनेज करना पड़ता है और यह जटिल परिदृश्यों के लिए उपयुक्त नहीं है।

उदाहरण: libz का उपयोग करके ZIP आर्काइव निकालना

import Foundation
import Compression

func unzipFile(at sourceURL: URL, to destinationURL: URL) throws {
    let sourceData = try Data(contentsOf: sourceURL)
    
    // सिस्टम डीकंप्रेसर का उपयोग करें
    let decodedData = try sourceData.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) -> Data in
        let sourcePtr = ptr.baseAddress!.assumingMemoryBound(to: UInt8.self)
        let sourceSize = sourceData.count
        
        // डीकंप्रेस्ड डेटा के लिए बफर (आमतौर पर मूल से बड़ा)
        let bufferSize = sourceSize * 4
        var buffer = Data(count: bufferSize)
        
        let decodedSize = buffer.withUnsafeMutableBytes { (destPtr: UnsafeMutableRawBufferPointer) -> Int in
            let dest = destPtr.baseAddress!.assumingMemoryBound(to: UInt8.self)
            return compression_decode_buffer(dest, bufferSize, sourcePtr, sourceSize, nil, COMPRESSION_ZLIB)
        }
        
        return buffer.prefix(decodedSize)
    }
    
    // डीकंप्रेस्ड डेटा को सेव करें
    try decodedData.write(to: destinationURL, options: .atomic)
}

बिल्ट-इन तरीके की सीमाएँ:

  • मल्टी-फ़ाइल आर्काइव के लिए सपोर्ट नहीं
  • पासवर्ड के साथ काम करने की सुविधा नहीं
  • बफ़र्स को मैन्युअली मैनेज करना पड़ता है
  • बड़ी फ़ाइलों को प्रोसेस करना मुश्किल

2. Zip Foundation लाइब्रेरी (अनुशंसित तरीका)

Zip Foundation एक open-source लाइब्रेरी है जो Swift में ZIP आर्काइव के साथ काम करने के लिए एक सरल और सुंदर API प्रदान करती है। यह सपोर्ट करती है:

  • आर्काइव बनाना और निकालना
  • पासवर्ड के साथ काम करना (AES-256)
  • Combine या क्लोज़र के ज़रिए प्रोग्रेस बार
  • बड़ी फ़ाइलों की स्ट्रीमिंग प्रोसेसिंग
  • macOS, iOS, watchOS और tvOS के लिए सपोर्ट

Swift Package Manager के ज़रिए इंस्टॉलेशन

// Package.swift फ़ाइल में या Xcode के ज़रिए:
dependencies: [
    .package(url: "https://github.com/marmelroy/Zip.git", from: "2.1.0")
]

उदाहरण: ZIP आर्काइव बनाना

import Zip

func createZipArchive() {
    let fileManager = FileManager.default
    let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
    
    // आर्काइव करने के लिए फ़ाइलें इकट्ठा करें
    let file1 = documentsURL.appendingPathComponent("report.pdf")
    let file2 = documentsURL.appendingPathComponent("photo.jpg")
    let filesToZip = [file1, file2]
    
    // भविष्य के आर्काइव का पथ
    let archiveURL = documentsURL.appendingPathComponent("backup.zip")
    
    do {
        // क्लोज़र के ज़रिए प्रोग्रेस
        try Zip.zipFiles(paths: filesToZip, zipFilePath: archiveURL, password: nil, progress: { (progress) in
            print("आर्काइव प्रोग्रेस: \(Int(progress * 100))%")
        })
        print("आर्काइव बन गया: \(archiveURL.path)")
    } catch {
        print("आर्काइव बनाने में त्रुटि: \(error.localizedDescription)")
    }
}

उदाहरण: पासवर्ड वाले आर्काइव को निकालना

import Zip

func unzipProtectedArchive() {
    let fileManager = Fil                    

अनुशंसाएँ