どうも、フリーランスのITエンジニア兼ブロガー兼投資家のKerubitoです。
Swiftでzipファイルの圧縮や解凍を手っ取り早くやりたい。
ありますよね。
とにかくサクッとzipファイルの圧縮や解凍をやりたいんじゃという人向けの記事です。
では、ぱぱっとやってみましょう。
環境は以下の通りです。
・Swiftバージョン:5
・Xcodeバージョン:12.2
・使用デバイス:iPhoneX(14.3)
SSZipArchiveを利用
Swiftで手っ取り早くzipファイルの圧縮・解凍をするにはSSZipArchiveというライブラリを使うのがいいでしょう。
以下がGitHubのURLです。
https://github.com/ZipArchive/ZipArchive
ほかにも手段はありますが、SSZipArchiveはStarが4.7kついている定番のライブラリ。
唯一難点なのがファイルにしか対応していないところです。
バイナリをzipに圧縮したり、逆にzipのバイナリを解凍をすることはできないっぽい。
なのでいったんファイルを介するやり方になってしまいますね。
Readmeには以下のことができるという記載があります。
- Unzip zip files;
- Unzip password protected zip files;
- Unzip AES encrypted zip files;
- Create zip files;
- Create large (> 4.3Gb) files;
- Create password protected zip files;
- Create AES encrypted zip files;
- Choose compression level;
- Zip-up NSData instances. (with a filename)
CocoaPodsでSSZipArchiveを使う
SSZipArchiveを利用するのに、ここではCocoaPodsというライブラリ管理パッケージを利用します。
CocoaPodsの導入に関しては以下の記事を参考にしてください。
SwiftでCocoaPodsを使う手順メモとios-chartsでグラフ表示
Swift でiphoneやiPad向けのアプリ開発をする際に、もはや必須となりつつあるライブラリ。 そのライブラリを便利に使うためのCocoaPodsの導入手順です。 CocoaPodsって何?って ...
続きを見る
SSZipArchiveでテキストファイルをzipに圧縮
SSZipArchiveを使ってテキストファイルをzipに圧縮しましょう。
toZipはバイナリデータ、zipのパス、zipの元ファイルのパスを受け取って、zipファイルを作成します。
SSZipArchiveのcreateZipFIleの戻り値がBoolであり、toZipもそれをそのまま返します。
1 2 3 4 5 6 | private func toZip(data: Data, archivePath: String, targetFilePaths: [String]) -> Bool { targetFilePaths.forEach { path in FileManager.default.createFile(atPath: path, contents: data, attributes: nil) } return SSZipArchive.createZipFile(atPath: archivePath, withFilesAtPaths: targetFilePaths) } |
呼び出し側です。
viewDidLoadで直接呼びます(笑
圧縮元のデータ、パスとzipのパスを準備し、toZipを呼び出します。
1 2 3 4 5 6 7 8 9 10 11 12 | override func viewDidLoad() { if let url = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first { let path = url.appendingPathComponent("sample.txt") let archivePath = URL.library.appendingPathComponent("sample.zip").path let targetFilePaths = ["\(path.path)",] let str = "サンプル" let data = str.data(using: .utf8) ?? Data() if !toZip(data: data, archivePath: archivePath, targetFilePaths: targetFilePaths) { print("zip化失敗") } } } |
以上、めちゃくちゃ簡単にzip圧縮ができてしまいますね。
SSZipArchiveでzipの解凍
SSZipArchiveを使ってzipを解凍しましょう。
unZipはより簡単。
SSZipArchive.unzipFile(atPath: archivePath, toDestination: url.path)を最後に追加しただけです。
これでいったん圧縮したテキストファイルを再び解凍します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | override func viewDidLoad() { if let url = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first { let path = url.appendingPathComponent("sample.txt") let archivePath = URL.library.appendingPathComponent("sample.zip").path let targetFilePaths = ["\(path.path)",] let str = "サンプル" let data = str.data(using: .utf8) ?? Data() if !toZip(data: data, archivePath: archivePath, targetFilePaths: targetFilePaths) { print("zip化失敗") } SSZipArchive.unzipFile(atPath: archivePath, toDestination: url.path) } } |
以上、楽しい開発ライフを!