Files
ZipArchive/Example/SwiftExample_macOS/ViewController.swift
T
2021-05-28 13:38:44 -07:00

173 lines
5.5 KiB
Swift

//
// ViewController.swift
// SwiftExample_macOS
//
// Created by Antoine Cœur on 2019/4/26.
//
import Cocoa
#if UseCarthage
import ZipArchive
#else
import SSZipArchive
#endif
class ViewController: NSViewController {
@IBOutlet weak var passwordField: NSTextField!
@IBOutlet weak var zipButton: NSButton!
@IBOutlet weak var unzipButton: NSButton!
@IBOutlet weak var hasPasswordButton: NSButton!
@IBOutlet weak var resetButton: NSButton!
@IBOutlet weak var file1: NSTextField!
@IBOutlet weak var file2: NSTextField!
@IBOutlet weak var file3: NSTextField!
@IBOutlet weak var info: NSTextField!
var samplePath: String!
var zipPath: String?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
samplePath = Bundle.main.bundleURL.appendingPathComponent("Contents/Resources/Sample Data").path
print("Sample path:", samplePath!)
resetPressed(resetButton)
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
// MARK: IBAction
@IBAction func zipPressed(_: NSButton) {
zipPath = tempZipPath()
print("Zip path:", zipPath!)
let password = passwordField.stringValue
let success = SSZipArchive.createZipFile(atPath: zipPath!,
withContentsOfDirectory: samplePath,
keepParentDirectory: false,
compressionLevel: -1,
password: !password.isEmpty ? password : nil,
aes: true,
progressHandler: nil)
if success {
print("Success zip")
info.stringValue = "Success zip"
unzipButton.isEnabled = true
hasPasswordButton.isEnabled = true
} else {
print("No success zip")
info.stringValue = "No success zip"
}
resetButton.isEnabled = true
}
@IBAction func unzipPressed(_: NSButton) {
guard let zipPath = self.zipPath else {
return
}
guard let unzipPath = tempUnzipPath() else {
return
}
print("Unzip path:", unzipPath)
let password = passwordField.stringValue
let success: Bool = SSZipArchive.unzipFile(atPath: zipPath,
toDestination: unzipPath,
preserveAttributes: true,
overwrite: true,
nestedZipLevel: 1,
password: !password.isEmpty ? password : nil,
error: nil,
delegate: nil,
progressHandler: nil,
completionHandler: nil)
if success != false {
print("Success unzip")
info.stringValue = "Success unzip"
} else {
print("No success unzip")
info.stringValue = "No success unzip"
return
}
var items: [String]
do {
items = try FileManager.default.contentsOfDirectory(atPath: unzipPath)
} catch {
return
}
for (index, item) in items.enumerated() {
switch index {
case 0:
file1.stringValue = item
case 1:
file2.stringValue = item
case 2:
file3.stringValue = item
default:
print("Went beyond index of assumed files")
}
}
unzipButton.isEnabled = false
}
@IBAction func hasPasswordPressed(_: NSButton) {
guard let zipPath = zipPath else {
return
}
let success = SSZipArchive.isFilePasswordProtected(atPath: zipPath)
if success {
print("Yes, it's password protected.")
info.stringValue = "Yes, it's password protected."
} else {
print("No, it's not password protected.")
info.stringValue = "No, it's not password protected."
}
}
@IBAction func resetPressed(_: NSButton) {
file1.stringValue = ""
file2.stringValue = ""
file3.stringValue = ""
info.stringValue = ""
zipButton.isEnabled = true
unzipButton.isEnabled = false
hasPasswordButton.isEnabled = false
resetButton.isEnabled = false
}
// MARK: Private
func tempZipPath() -> String {
var path = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
path += "/\(UUID().uuidString).zip"
return path
}
func tempUnzipPath() -> String? {
var path = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
path += "/\(UUID().uuidString)"
let url = URL(fileURLWithPath: path)
do {
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)
} catch {
return nil
}
return url.path
}
}