diff --git a/.gitignore b/.gitignore
index 8615121b24a361eb4d1a5f1d06ca38d91202f7ec..4f490432a25c0902f13dc074adf5e428329d3742 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
+# MacOS
+.DS_Store
# Xcode
#
build/
diff --git a/.swift-version b/.swift-version
new file mode 100644
index 0000000000000000000000000000000000000000..9f55b2ccb5f234fc6b87ada62389a3d73815d0d1
--- /dev/null
+++ b/.swift-version
@@ -0,0 +1 @@
+3.0
diff --git a/.travis.yml b/.travis.yml
index e684827e442529810b23a059fbdaef0093479723..273f79b4c9144c886a0770d1cee69afd7ff6b08e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,14 +1,11 @@
-osx_image: xcode7.2
+osx_image: xcode8
language: objective-c
env:
global:
- LC_CTYPE=en_US.UTF-8
- LANG=en_US.UTF-8
before_install:
- - brew update || brew update
- - brew outdated xctool || brew upgrade xctool
- - gem install cocoapods
- - xcrun simctl list
+ - gem install cocoapods --pre
install: echo "<3"
env:
- MODE=framework
diff --git a/README.md b/README.md
index 6471903f7c886e0fbc7f590356f091b73dca53c1..bf65a98fa54044b74adb533fdf5befda828b80b5 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,6 @@

[](https://travis-ci.org/marmelroy/Zip) [](http://cocoapods.org/?q=Zip)
-[](https://github.com/Carthage/Carthage)
# Zip
A Swift framework for zipping and unzipping files. Simple and quick to use. Built on top of [minizip](https://github.com/nmoinvaz/minizip).
@@ -58,26 +57,8 @@ Zip supports '.zip' and '.cbz' files out of the box. To support additional zip-d
Zip.addCustomFileExtension("file-extension-here")
```
-
-### Setting up with Carthage
-
-[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that automates the process of adding frameworks to your Cocoa application.
-
-You can install Carthage with [Homebrew](http://brew.sh/) using the following command:
-
-```bash
-$ brew update
-$ brew install carthage
-```
-
-To integrate Format into your Xcode project using Carthage, specify it in your `Cartfile`:
-
-```ogdl
-github "marmelroy/Zip"
-```
-
### Setting up with [CocoaPods](http://cocoapods.org/?q=Zip)
```ruby
source 'https://github.com/CocoaPods/Specs.git'
-pod 'Zip', '~> 0.4'
+pod 'Zip', '~> 0.5', :submodules => true
```
diff --git a/Zip copy-Info.plist b/Zip copy-Info.plist
deleted file mode 100644
index 1624b1cd2dc9b89609b985d8dbfe91250d937114..0000000000000000000000000000000000000000
--- a/Zip copy-Info.plist
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- en
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 0.4.3
- CFBundleSignature
- ????
- CFBundleVersion
- 7
- NSPrincipalClass
-
-
-
diff --git a/Zip.podspec b/Zip.podspec
index 8e2827daf2d73e03b701dbdd9ae30508594f1f2a..028e335eb78ad3e7cbdc7e4eb89aa9811b5ea150 100644
--- a/Zip.podspec
+++ b/Zip.podspec
@@ -8,7 +8,7 @@
Pod::Spec.new do |s|
s.name = "Zip"
- s.version = "0.4.3"
+ s.version = "0.5"
s.summary = "Zip and unzip files in Swift."
# This description is used to generate tags and improve search results.
diff --git a/Zip.xcodeproj/project.pbxproj b/Zip.xcodeproj/project.pbxproj
index 452beb6619a07f13d498e826e3455a24f215ac74..60e1f24da39602927a9bab83a2d2ced745cc5513 100644
--- a/Zip.xcodeproj/project.pbxproj
+++ b/Zip.xcodeproj/project.pbxproj
@@ -133,7 +133,6 @@
/* Begin PBXFileReference section */
342545B51CE525B200336074 /* Zip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Zip.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 342545B61CE525B300336074 /* Zip copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Zip copy-Info.plist"; path = "/Users/marmelroy/Documents/Projects/OpenSource/Zip/Zip copy-Info.plist"; sourceTree = ""; };
342FC0D21C5044DC0023A3C3 /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = ""; };
342FC0D31C5044DC0023A3C3 /* aes_via_ace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes_via_ace.h; sourceTree = ""; };
342FC0D41C5044DC0023A3C3 /* aescrypt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aescrypt.c; sourceTree = ""; };
@@ -275,7 +274,6 @@
347E3A761C1DFFB500A11FD3 /* Zip */,
347E3A821C1DFFB500A11FD3 /* ZipTests */,
347E3A751C1DFFB500A11FD3 /* Products */,
- 342545B61CE525B300336074 /* Zip copy-Info.plist */,
);
sourceTree = "";
};
@@ -493,7 +491,7 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0720;
- LastUpgradeCheck = 0720;
+ LastUpgradeCheck = 0800;
ORGANIZATIONNAME = "Roy Marmelstein";
TargetAttributes = {
343F50FE1C8DAEEC0028C434 = {
@@ -504,9 +502,11 @@
};
347E3A731C1DFFB500A11FD3 = {
CreatedOnToolsVersion = 7.2;
+ LastSwiftMigration = 0800;
};
347E3A7D1C1DFFB500A11FD3 = {
CreatedOnToolsVersion = 7.2;
+ LastSwiftMigration = 0800;
};
};
};
@@ -677,9 +677,9 @@
CLANG_ENABLE_MODULES = YES;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 7;
+ DYLIB_CURRENT_VERSION = 8;
DYLIB_INSTALL_NAME_BASE = "@rpath";
- INFOPLIST_FILE = "Zip copy-Info.plist";
+ INFOPLIST_FILE = "Zip/Info-tvOS.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
@@ -702,9 +702,9 @@
CLANG_ENABLE_MODULES = YES;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 7;
+ DYLIB_CURRENT_VERSION = 8;
DYLIB_INSTALL_NAME_BASE = "@rpath";
- INFOPLIST_FILE = "Zip copy-Info.plist";
+ INFOPLIST_FILE = "Zip/Info-tvOS.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
@@ -714,6 +714,7 @@
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "appletvsimulator appletvos";
SWIFT_INCLUDE_PATHS = "${SRCROOT}/Zip/minizip/**";
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
TARGETED_DEVICE_FAMILY = 3;
TVOS_DEPLOYMENT_TARGET = 9.0;
};
@@ -724,10 +725,10 @@
buildSettings = {
CODE_SIGN_IDENTITY = "-";
COMBINE_HIDPI_IMAGES = YES;
- CURRENT_PROJECT_VERSION = 7;
+ CURRENT_PROJECT_VERSION = 8;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 7;
+ DYLIB_CURRENT_VERSION = 8;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_VERSION = A;
INFOPLIST_FILE = Zip/Info.plist;
@@ -747,10 +748,10 @@
buildSettings = {
CODE_SIGN_IDENTITY = "-";
COMBINE_HIDPI_IMAGES = YES;
- CURRENT_PROJECT_VERSION = 7;
+ CURRENT_PROJECT_VERSION = 8;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 7;
+ DYLIB_CURRENT_VERSION = 8;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_VERSION = A;
INFOPLIST_FILE = Zip/Info.plist;
@@ -762,6 +763,7 @@
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_INCLUDE_PATHS = "${SRCROOT}/Zip/minizip/**";
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
};
name = Release;
};
@@ -812,7 +814,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
- CURRENT_PROJECT_VERSION = 7;
+ CURRENT_PROJECT_VERSION = 8;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
@@ -835,6 +837,7 @@
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 3.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
@@ -860,7 +863,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
- CURRENT_PROJECT_VERSION = 7;
+ CURRENT_PROJECT_VERSION = 8;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -875,6 +878,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
+ SWIFT_VERSION = 3.0;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
@@ -889,7 +893,7 @@
CLANG_ENABLE_MODULES = YES;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 7;
+ DYLIB_CURRENT_VERSION = 8;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Zip/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -911,7 +915,7 @@
CLANG_ENABLE_MODULES = YES;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 7;
+ DYLIB_CURRENT_VERSION = 8;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Zip/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -922,6 +926,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_INCLUDE_PATHS = "${SRCROOT}/Zip/minizip/**";
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
};
name = Release;
};
@@ -942,6 +947,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.roymarmelstein.ZipTests;
PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
};
name = Release;
};
diff --git a/Zip.xcodeproj/xcshareddata/xcschemes/Zip OSX.xcscheme b/Zip.xcodeproj/xcshareddata/xcschemes/Zip OSX.xcscheme
index f802b86d77595215664fcbc48ebf23457a6425c3..dbc1918043198585f5287149f8a64a984f18a549 100644
--- a/Zip.xcodeproj/xcshareddata/xcschemes/Zip OSX.xcscheme
+++ b/Zip.xcodeproj/xcshareddata/xcschemes/Zip OSX.xcscheme
@@ -1,6 +1,6 @@
CFBundlePackageType
FMWK
CFBundleShortVersionString
- 0.4.1
+ 0.5.0
CFBundleSignature
????
CFBundleVersion
- 6
+ 8
NSPrincipalClass
diff --git a/Zip/Info.plist b/Zip/Info.plist
index 1624b1cd2dc9b89609b985d8dbfe91250d937114..43de941fda27cd7cfe7d80659030d190cb6b921d 100644
--- a/Zip/Info.plist
+++ b/Zip/Info.plist
@@ -15,11 +15,11 @@
CFBundlePackageType
FMWK
CFBundleShortVersionString
- 0.4.3
+ 0.5.0
CFBundleSignature
????
CFBundleVersion
- 7
+ 8
NSPrincipalClass
diff --git a/Zip/QuickZip.swift b/Zip/QuickZip.swift
index 3cb1548e6af39fae823868b8a7649962ec91f67c..a9d703fd67eabcea6b6072b739e0a336043941ff 100644
--- a/Zip/QuickZip.swift
+++ b/Zip/QuickZip.swift
@@ -21,7 +21,7 @@ extension Zip {
- returns: NSURL of the destination folder.
*/
- public class func quickUnzipFile(path: NSURL) throws -> NSURL {
+ public class func quickUnzipFile(_ path: URL) throws -> URL {
return try quickUnzipFile(path, progress: nil)
}
@@ -37,16 +37,21 @@ extension Zip {
- returns: NSURL of the destination folder.
*/
- public class func quickUnzipFile(path: NSURL, progress: ((progress: Double) -> ())?) throws -> NSURL {
- let fileManager = NSFileManager.defaultManager()
- guard let fileExtension = path.pathExtension, let fileName = path.lastPathComponent else {
- throw ZipError.UnzipFail
+ public class func quickUnzipFile(_ path: URL, progress: ((_ progress: Double) -> ())?) throws -> URL {
+ let fileManager = FileManager.default
+
+ let fileExtension = path.pathExtension
+ let fileName = path.lastPathComponent
+
+ let directoryName = fileName.replacingOccurrences(of: ".\(fileExtension)", with: "")
+ let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
+ do {
+ let destinationUrl = documentsUrl.appendingPathComponent(directoryName, isDirectory: true)
+ try self.unzipFile(path, destination: destinationUrl, overwrite: true, password: nil, progress: progress)
+ return destinationUrl
+ }catch{
+ throw(ZipError.unzipFail)
}
- let directoryName = fileName.stringByReplacingOccurrencesOfString(".\(fileExtension)", withString: "")
- let documentsUrl = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
- let destinationUrl = documentsUrl.URLByAppendingPathComponent(directoryName, isDirectory: true)
- try self.unzipFile(path, destination: destinationUrl, overwrite: true, password: nil, progress: progress)
- return destinationUrl
}
//MARK: Quick Zip
@@ -63,7 +68,7 @@ extension Zip {
- returns: NSURL of the destination folder.
*/
- public class func quickZipFiles(paths: [NSURL], fileName: String) throws -> NSURL {
+ public class func quickZipFiles(_ paths: [URL], fileName: String) throws -> URL {
return try quickZipFiles(paths, fileName: fileName, progress: nil)
}
@@ -80,13 +85,13 @@ extension Zip {
- returns: NSURL of the destination folder.
*/
- public class func quickZipFiles(paths: [NSURL], fileName: String, progress: ((progress: Double) -> ())?) throws -> NSURL {
- let fileManager = NSFileManager.defaultManager()
- let documentsUrl = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
- let destinationUrl = documentsUrl.URLByAppendingPathComponent("\(fileName).zip")
+ public class func quickZipFiles(_ paths: [URL], fileName: String, progress: ((_ progress: Double) -> ())?) throws -> URL {
+ let fileManager = FileManager.default
+ let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
+ let destinationUrl = documentsUrl.appendingPathComponent("\(fileName).zip")
try self.zipFiles(paths, zipFilePath: destinationUrl, password: nil, progress: progress)
return destinationUrl
}
-}
\ No newline at end of file
+}
diff --git a/Zip/Zip.swift b/Zip/Zip.swift
index 4ae40fecf68b50a209a68d8dfb220e14d96f24ae..cd3a395077743eb210db29c117aae10635f753bc 100644
--- a/Zip/Zip.swift
+++ b/Zip/Zip.swift
@@ -10,20 +10,20 @@ import Foundation
import minizip
/// Zip error type
-public enum ZipError: ErrorType {
+public enum ZipError: Error {
/// File not found
- case FileNotFound
+ case fileNotFound
/// Unzip fail
- case UnzipFail
+ case unzipFail
/// Zip fail
- case ZipFail
+ case zipFail
/// User readable description
public var description: String {
switch self {
- case .FileNotFound: return NSLocalizedString("File not found.", comment: "")
- case .UnzipFail: return NSLocalizedString("Failed to unzip file.", comment: "")
- case .ZipFail: return NSLocalizedString("Failed to zip file.", comment: "")
+ case .fileNotFound: return NSLocalizedString("File not found.", comment: "")
+ case .unzipFail: return NSLocalizedString("Failed to unzip file.", comment: "")
+ case .zipFail: return NSLocalizedString("Failed to zip file.", comment: "")
}
}
}
@@ -62,37 +62,36 @@ public class Zip {
- notes: Supports implicit progress composition
*/
- public class func unzipFile(zipFilePath: NSURL, destination: NSURL, overwrite: Bool, password: String?, progress: ((progress: Double) -> ())?) throws {
+ public class func unzipFile(_ zipFilePath: URL, destination: URL, overwrite: Bool, password: String?, progress: ((_ progress: Double) -> ())?) throws {
// File manager
- let fileManager = NSFileManager.defaultManager()
+ let fileManager = FileManager.default
// Check whether a zip file exists at path.
- guard let path = zipFilePath.path where destination.path != nil else {
- throw ZipError.FileNotFound
- }
- if fileManager.fileExistsAtPath(path) == false || fileExtensionIsInvalid(zipFilePath.pathExtension) {
- throw ZipError.FileNotFound
+ let path = zipFilePath.path
+
+ if fileManager.fileExists(atPath: path) == false || fileExtensionIsInvalid(zipFilePath.pathExtension) {
+ throw ZipError.fileNotFound
}
// Unzip set up
var ret: Int32 = 0
var crc_ret: Int32 = 0
let bufferSize: UInt32 = 4096
- var buffer = Array(count: Int(bufferSize), repeatedValue: 0)
+ var buffer = Array(repeating: 0, count: Int(bufferSize))
// Progress handler set up
var totalSize: Double = 0.0
var currentPosition: Double = 0.0
- let fileAttributes = try fileManager.attributesOfItemAtPath(path)
- if let attributeFileSize = fileAttributes[NSFileSize] as? Double {
+ let fileAttributes = try fileManager.attributesOfItem(atPath: path)
+ if let attributeFileSize = fileAttributes[FileAttributeKey.size] as? Double {
totalSize += attributeFileSize
}
- let progressTracker = NSProgress(totalUnitCount: Int64(totalSize))
- progressTracker.cancellable = false
- progressTracker.pausable = false
- progressTracker.kind = NSProgressKindFile
+ let progressTracker = Progress(totalUnitCount: Int64(totalSize))
+ progressTracker.isCancellable = false
+ progressTracker.isPausable = false
+ progressTracker.kind = ProgressKind.file
// Begin unzipping
let zip = unzOpen64(path)
@@ -100,64 +99,67 @@ public class Zip {
unzClose(zip)
}
if unzGoToFirstFile(zip) != UNZ_OK {
- throw ZipError.UnzipFail
+ throw ZipError.unzipFail
}
repeat {
- if let cPassword = password?.cStringUsingEncoding(NSASCIIStringEncoding) {
+ if let cPassword = password?.cString(using: String.Encoding.ascii) {
ret = unzOpenCurrentFilePassword(zip, cPassword)
}
else {
ret = unzOpenCurrentFile(zip);
}
if ret != UNZ_OK {
- throw ZipError.UnzipFail
+ throw ZipError.unzipFail
}
var fileInfo = unz_file_info64()
- memset(&fileInfo, 0, sizeof(unz_file_info))
+ memset(&fileInfo, 0, MemoryLayout.size)
ret = unzGetCurrentFileInfo64(zip, &fileInfo, nil, 0, nil, 0, nil, 0)
if ret != UNZ_OK {
unzCloseCurrentFile(zip)
- throw ZipError.UnzipFail
+ throw ZipError.unzipFail
}
currentPosition += Double(fileInfo.compressed_size)
let fileNameSize = Int(fileInfo.size_filename) + 1
- let fileName = UnsafeMutablePointer.alloc(fileNameSize)
- if fileName == nil {
- throw ZipError.UnzipFail
- }
+ //let fileName = UnsafeMutablePointer(allocatingCapacity: fileNameSize)
+ let fileName = UnsafeMutablePointer.allocate(capacity: fileNameSize)
+
unzGetCurrentFileInfo64(zip, &fileInfo, fileName, UInt(fileNameSize), nil, 0, nil, 0)
fileName[Int(fileInfo.size_filename)] = 0
- guard var pathString = String(CString: fileName, encoding: NSUTF8StringEncoding) else {
- throw ZipError.UnzipFail
+ var pathString = String(cString: fileName)
+
+ guard pathString.characters.count > 0 else {
+ throw ZipError.unzipFail
}
+
var isDirectory = false
let fileInfoSizeFileName = Int(fileInfo.size_filename-1)
- if (fileName[fileInfoSizeFileName] == "/".cStringUsingEncoding(NSUTF8StringEncoding)?.first || fileName[fileInfoSizeFileName] == "\\".cStringUsingEncoding(NSUTF8StringEncoding)?.first) {
+ if (fileName[fileInfoSizeFileName] == "/".cString(using: String.Encoding.utf8)?.first || fileName[fileInfoSizeFileName] == "\\".cString(using: String.Encoding.utf8)?.first) {
isDirectory = true;
}
free(fileName)
- if pathString.rangeOfCharacterFromSet(NSCharacterSet(charactersInString: "/\\")) != nil {
- pathString = pathString.stringByReplacingOccurrencesOfString("\\", withString: "/")
- }
- guard let fullPath = destination.URLByAppendingPathComponent(pathString).path else {
- throw ZipError.UnzipFail
+ if pathString.rangeOfCharacter(from: CharacterSet(charactersIn: "/\\")) != nil {
+ pathString = pathString.replacingOccurrences(of: "\\", with: "/")
}
- let creationDate = NSDate()
- let directoryAttributes = [NSFileCreationDate: creationDate, NSFileModificationDate: creationDate]
+
+ let fullPath = destination.appendingPathComponent(pathString).path
+
+ let creationDate = Date()
+ let directoryAttributes = [FileAttributeKey.creationDate.rawValue : creationDate,
+ FileAttributeKey.modificationDate.rawValue : creationDate]
do {
if isDirectory {
- try fileManager.createDirectoryAtPath(fullPath, withIntermediateDirectories: true, attributes: directoryAttributes)
+ try fileManager.createDirectory(atPath: fullPath, withIntermediateDirectories: true, attributes: directoryAttributes)
}
else {
- let parentDirectory = (fullPath as NSString).stringByDeletingLastPathComponent
- try fileManager.createDirectoryAtPath(parentDirectory, withIntermediateDirectories: true, attributes: directoryAttributes)
+ let parentDirectory = (fullPath as NSString).deletingLastPathComponent
+ try fileManager.createDirectory(atPath: parentDirectory, withIntermediateDirectories: true, attributes: directoryAttributes)
}
} catch {}
- if fileManager.fileExistsAtPath(fullPath) && !isDirectory && !overwrite {
+ if fileManager.fileExists(atPath: fullPath) && !isDirectory && !overwrite {
unzCloseCurrentFile(zip)
ret = unzGoToNextFile(zip)
}
- var filePointer: UnsafeMutablePointer
+ var filePointer: UnsafeMutablePointer?
filePointer = fopen(fullPath, "wb")
while filePointer != nil {
let readBytes = unzReadCurrentFile(zip, &buffer, bufferSize)
@@ -171,13 +173,13 @@ public class Zip {
fclose(filePointer)
crc_ret = unzCloseCurrentFile(zip)
if crc_ret == UNZ_CRCERROR {
- throw ZipError.UnzipFail
+ throw ZipError.unzipFail
}
ret = unzGoToNextFile(zip)
// Update progress handler
if let progressHandler = progress{
- progressHandler(progress: (currentPosition/totalSize))
+ progressHandler((currentPosition/totalSize))
}
progressTracker.completedUnitCount = Int64(currentPosition)
@@ -186,7 +188,7 @@ public class Zip {
// Completed. Update progress handler.
if let progressHandler = progress{
- progressHandler(progress: 1.0)
+ progressHandler(1.0)
}
progressTracker.completedUnitCount = Int64(totalSize)
@@ -207,15 +209,13 @@ public class Zip {
- notes: Supports implicit progress composition
*/
- public class func zipFiles(paths: [NSURL], zipFilePath: NSURL, password: String?, progress: ((progress: Double) -> ())?) throws {
+ public class func zipFiles(_ paths: [URL], zipFilePath: URL, password: String?, progress: ((_ progress: Double) -> ())?) throws {
// File manager
- let fileManager = NSFileManager.defaultManager()
+ let fileManager = FileManager.default
// Check whether a zip file exists at path.
- guard let destinationPath = zipFilePath.path else {
- throw ZipError.FileNotFound
- }
+ let destinationPath = zipFilePath.path
// Process zip paths
let processedPaths = ZipUtilities().processZipPaths(paths)
@@ -230,8 +230,8 @@ public class Zip {
for path in processedPaths {
do {
let filePath = path.filePath()
- let fileAttributes = try fileManager.attributesOfItemAtPath(filePath)
- let fileSize = fileAttributes[NSFileSize] as? Double
+ let fileAttributes = try fileManager.attributesOfItem(atPath: filePath)
+ let fileSize = fileAttributes[FileAttributeKey.size] as? Double
if let fileSize = fileSize {
totalSize += fileSize
}
@@ -239,36 +239,36 @@ public class Zip {
catch {}
}
- let progressTracker = NSProgress(totalUnitCount: Int64(totalSize))
- progressTracker.cancellable = false
- progressTracker.pausable = false
- progressTracker.kind = NSProgressKindFile
+ let progressTracker = Progress(totalUnitCount: Int64(totalSize))
+ progressTracker.isCancellable = false
+ progressTracker.isPausable = false
+ progressTracker.kind = ProgressKind.file
// Begin Zipping
let zip = zipOpen(destinationPath, APPEND_STATUS_CREATE)
for path in processedPaths {
let filePath = path.filePath()
var isDirectory: ObjCBool = false
- fileManager.fileExistsAtPath(filePath, isDirectory: &isDirectory)
- if !isDirectory {
+ fileManager.fileExists(atPath: filePath, isDirectory: &isDirectory)
+ if !isDirectory.boolValue {
let input = fopen(filePath, "r")
if input == nil {
- throw ZipError.ZipFail
+ throw ZipError.zipFail
}
let fileName = path.fileName
var zipInfo: zip_fileinfo = zip_fileinfo(tmz_date: tm_zip(tm_sec: 0, tm_min: 0, tm_hour: 0, tm_mday: 0, tm_mon: 0, tm_year: 0), dosDate: 0, internal_fa: 0, external_fa: 0)
do {
- let fileAttributes = try fileManager.attributesOfItemAtPath(filePath)
- if let fileDate = fileAttributes[NSFileModificationDate] as? NSDate {
- let components = NSCalendar.currentCalendar().components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: fileDate)
- zipInfo.tmz_date.tm_sec = UInt32(components.second)
- zipInfo.tmz_date.tm_min = UInt32(components.minute)
- zipInfo.tmz_date.tm_hour = UInt32(components.hour)
- zipInfo.tmz_date.tm_mday = UInt32(components.day)
- zipInfo.tmz_date.tm_mon = UInt32(components.month) - 1
- zipInfo.tmz_date.tm_year = UInt32(components.year)
+ let fileAttributes = try fileManager.attributesOfItem(atPath: filePath)
+ if let fileDate = fileAttributes[FileAttributeKey.modificationDate] as? Date {
+ let components = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: fileDate)
+ zipInfo.tmz_date.tm_sec = UInt32(components.second!)
+ zipInfo.tmz_date.tm_min = UInt32(components.minute!)
+ zipInfo.tmz_date.tm_hour = UInt32(components.hour!)
+ zipInfo.tmz_date.tm_mday = UInt32(components.day!)
+ zipInfo.tmz_date.tm_mon = UInt32(components.month!) - 1
+ zipInfo.tmz_date.tm_year = UInt32(components.year!)
}
- if let fileSize = fileAttributes[NSFileSize] as? Double {
+ if let fileSize = fileAttributes[FileAttributeKey.size] as? Double {
currentPosition += fileSize
}
}
@@ -281,7 +281,7 @@ public class Zip {
zipOpenNewFileInZip3(zip, fileName, &zipInfo, nil, 0, nil, 0, nil,Z_DEFLATED, Z_DEFAULT_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, nil, 0)
}
else {
- throw ZipError.ZipFail
+ throw ZipError.zipFail
}
var length: Int = 0
while (feof(input) == 0) {
@@ -291,7 +291,7 @@ public class Zip {
// Update progress handler
if let progressHandler = progress{
- progressHandler(progress: (currentPosition/totalSize))
+ progressHandler((currentPosition/totalSize))
}
progressTracker.completedUnitCount = Int64(currentPosition)
@@ -305,7 +305,7 @@ public class Zip {
// Completed. Update progress handler.
if let progressHandler = progress{
- progressHandler(progress: 1.0)
+ progressHandler(1.0)
}
progressTracker.completedUnitCount = Int64(totalSize)
@@ -318,7 +318,7 @@ public class Zip {
- returns: false if the extension is a valid file extension, otherwise true.
*/
- internal class func fileExtensionIsInvalid(fileExtension: String?) -> Bool {
+ internal class func fileExtensionIsInvalid(_ fileExtension: String?) -> Bool {
guard let fileExtension = fileExtension else { return true }
@@ -330,7 +330,7 @@ public class Zip {
- parameter fileExtension: A file extension.
*/
- public class func addCustomFileExtension(fileExtension: String) {
+ public class func addCustomFileExtension(_ fileExtension: String) {
customFileExtensions.insert(fileExtension)
}
@@ -339,7 +339,7 @@ public class Zip {
- parameter fileExtension: A file extension.
*/
- public class func removeCustomFileExtension(fileExtension: String) {
+ public class func removeCustomFileExtension(_ fileExtension: String) {
customFileExtensions.remove(fileExtension)
}
@@ -350,7 +350,7 @@ public class Zip {
- returns: true if the extension valid, otherwise false.
*/
- public class func isValidFileExtension(fileExtension: String) -> Bool {
+ public class func isValidFileExtension(_ fileExtension: String) -> Bool {
let validFileExtensions: Set = customFileExtensions.union(["zip", "cbz"])
diff --git a/Zip/ZipUtilities.swift b/Zip/ZipUtilities.swift
index f6034dd35292c34b9e825a871b9302423c539942..4759336f395a59661a059ea4b023b70d9883100a 100644
--- a/Zip/ZipUtilities.swift
+++ b/Zip/ZipUtilities.swift
@@ -11,22 +11,17 @@ import Foundation
internal class ZipUtilities {
// File manager
- let fileManager = NSFileManager.defaultManager()
+ let fileManager = FileManager.default
/**
* ProcessedFilePath struct
*/
internal struct ProcessedFilePath {
- let filePathURL: NSURL
+ let filePathURL: URL
let fileName: String?
func filePath() -> String {
- if let filePath = filePathURL.path {
- return filePath
- }
- else {
- return String()
- }
+ return filePathURL.path
}
}
@@ -39,21 +34,19 @@ internal class ZipUtilities {
- returns: Array of ProcessedFilePath structs.
*/
- internal func processZipPaths(paths: [NSURL]) -> [ProcessedFilePath]{
+ internal func processZipPaths(_ paths: [URL]) -> [ProcessedFilePath]{
var processedFilePaths = [ProcessedFilePath]()
for path in paths {
- guard let filePath = path.path else {
- continue
- }
+ let filePath = path.path
var isDirectory: ObjCBool = false
- fileManager.fileExistsAtPath(filePath, isDirectory: &isDirectory)
- if !isDirectory {
+ fileManager.fileExists(atPath: filePath, isDirectory: &isDirectory)
+ if !isDirectory.boolValue {
let processedPath = ProcessedFilePath(filePathURL: path, fileName: path.lastPathComponent)
processedFilePaths.append(processedPath)
}
else {
let directoryContents = expandDirectoryFilePath(path)
- processedFilePaths.appendContentsOf(directoryContents)
+ processedFilePaths.append(contentsOf: directoryContents)
}
}
return processedFilePaths
@@ -67,27 +60,25 @@ internal class ZipUtilities {
- returns: Array of ProcessedFilePath structs.
*/
- internal func expandDirectoryFilePath(directory: NSURL) -> [ProcessedFilePath] {
+ internal func expandDirectoryFilePath(_ directory: URL) -> [ProcessedFilePath] {
var processedFilePaths = [ProcessedFilePath]()
- if let directoryPath = directory.path, let enumerator = fileManager.enumeratorAtPath(directoryPath) {
+ let directoryPath = directory.path
+ if let enumerator = fileManager.enumerator(atPath: directoryPath) {
while let filePathComponent = enumerator.nextObject() as? String {
- let path = directory.URLByAppendingPathComponent(filePathComponent)
- guard let filePath = path.path, let directoryName = directory.lastPathComponent else {
- continue
- }
+ let path = directory.appendingPathComponent(filePathComponent)
+ let filePath = path.path
+ let directoryName = directory.lastPathComponent
+
var isDirectory: ObjCBool = false
- fileManager.fileExistsAtPath(filePath, isDirectory: &isDirectory)
- if !isDirectory {
- let fileName = (directoryName as NSString).stringByAppendingPathComponent(filePathComponent)
+ fileManager.fileExists(atPath: filePath, isDirectory: &isDirectory)
+ if !isDirectory.boolValue {
+ let fileName = (directoryName as NSString).appendingPathComponent(filePathComponent)
let processedPath = ProcessedFilePath(filePathURL: path, fileName: fileName)
processedFilePaths.append(processedPath)
}
- else {
- let directoryContents = expandDirectoryFilePath(path)
- }
}
}
return processedFilePaths
}
-}
\ No newline at end of file
+}
diff --git a/ZipTests/Info.plist b/ZipTests/Info.plist
index 5dac350627191ee0e3edffba20fa90d386415230..900e133d064639a0108b21f6fe4c4ecdaeb9a7f3 100644
--- a/ZipTests/Info.plist
+++ b/ZipTests/Info.plist
@@ -15,10 +15,10 @@
CFBundlePackageType
BNDL
CFBundleShortVersionString
- 0.4.3
+ 0.5.0
CFBundleSignature
????
CFBundleVersion
- 7
+ 8
diff --git a/ZipTests/ZipTests.swift b/ZipTests/ZipTests.swift
index 153d01d0017ef791a300f862b4bfabd7085ca159..ed4334dbdb3e886009de953068da07aa6d96122b 100644
--- a/ZipTests/ZipTests.swift
+++ b/ZipTests/ZipTests.swift
@@ -21,10 +21,10 @@ class ZipTests: XCTestCase {
func testQuickUnzip() {
do {
- let filePath = NSBundle(forClass: ZipTests.self).URLForResource("bb8", withExtension: "zip")!
+ let filePath = Bundle(for: ZipTests.self).url(forResource: "bb8", withExtension: "zip")!
let destinationURL = try Zip.quickUnzipFile(filePath)
- let fileManager = NSFileManager.defaultManager()
- XCTAssertTrue(fileManager.fileExistsAtPath(destinationURL.path!))
+ let fileManager = FileManager.default
+ XCTAssertTrue(fileManager.fileExists(atPath: destinationURL.path))
}
catch {
XCTFail()
@@ -33,11 +33,11 @@ class ZipTests: XCTestCase {
func testQuickUnzipNonExistingPath() {
do {
- let filePathURL = NSBundle(forClass: ZipTests.self).resourcePath
+ let filePathURL = Bundle(for: ZipTests.self).resourcePath
let filePath = NSURL(string:"\(filePathURL!)/bb9.zip")
- let destinationURL = try Zip.quickUnzipFile(filePath!)
- let fileManager = NSFileManager.defaultManager()
- XCTAssertFalse(fileManager.fileExistsAtPath(destinationURL.path!))
+ let destinationURL = try Zip.quickUnzipFile(filePath! as URL)
+ let fileManager = FileManager.default
+ XCTAssertFalse(fileManager.fileExists(atPath:destinationURL.path))
}
catch {
XCTAssert(true)
@@ -46,10 +46,10 @@ class ZipTests: XCTestCase {
func testQuickUnzipNonZipPath() {
do {
- let filePath = NSBundle(forClass: ZipTests.self).URLForResource("3crBXeO", withExtension: "gif")!
+ let filePath = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
let destinationURL = try Zip.quickUnzipFile(filePath)
- let fileManager = NSFileManager.defaultManager()
- XCTAssertFalse(fileManager.fileExistsAtPath(destinationURL.path!))
+ let fileManager = FileManager.default
+ XCTAssertFalse(fileManager.fileExists(atPath:destinationURL.path))
}
catch {
XCTAssert(true)
@@ -58,8 +58,8 @@ class ZipTests: XCTestCase {
func testQuickUnzipProgress() {
do {
- let filePath = NSBundle(forClass: ZipTests.self).URLForResource("bb8", withExtension: "zip")!
- try Zip.quickUnzipFile(filePath, progress: { (progress) -> () in
+ let filePath = Bundle(for: ZipTests.self).url(forResource: "bb8", withExtension: "zip")!
+ _ = try Zip.quickUnzipFile(filePath, progress: { (progress) -> () in
XCTAssert(true)
})
}
@@ -71,9 +71,9 @@ class ZipTests: XCTestCase {
func testQuickUnzipOnlineURL() {
do {
let filePath = NSURL(string: "http://www.google.com/google.zip")!
- let destinationURL = try Zip.quickUnzipFile(filePath)
- let fileManager = NSFileManager.defaultManager()
- XCTAssertFalse(fileManager.fileExistsAtPath(destinationURL.path!))
+ let destinationURL = try Zip.quickUnzipFile(filePath as URL)
+ let fileManager = FileManager.default
+ XCTAssertFalse(fileManager.fileExists(atPath:destinationURL.path))
}
catch {
XCTAssert(true)
@@ -82,15 +82,15 @@ class ZipTests: XCTestCase {
func testUnzip() {
do {
- let filePath = NSBundle(forClass: ZipTests.self).URLForResource("bb8", withExtension: "zip")!
- let documentsFolder = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
+ let filePath = Bundle(for: ZipTests.self).url(forResource: "bb8", withExtension: "zip")!
+ let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
- try Zip.unzipFile(filePath, destination: documentsFolder, overwrite: true, password: "password", progress: { (progress) -> () in
+ try Zip.unzipFile(filePath, destination: documentsFolder as URL, overwrite: true, password: "password", progress: { (progress) -> () in
print(progress)
})
- let fileManager = NSFileManager.defaultManager()
- XCTAssertTrue(fileManager.fileExistsAtPath(documentsFolder.path!))
+ let fileManager = FileManager.default
+ XCTAssertTrue(fileManager.fileExists(atPath:documentsFolder.path!))
}
catch {
XCTFail()
@@ -99,14 +99,14 @@ class ZipTests: XCTestCase {
func testImplicitProgressUnzip() {
do {
- let progress = NSProgress()
+ let progress = Progress()
progress.totalUnitCount = 1
- let filePath = NSBundle(forClass: ZipTests.self).URLForResource("bb8", withExtension: "zip")!
- let documentsFolder = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
+ let filePath = Bundle(for: ZipTests.self).url(forResource: "bb8", withExtension: "zip")!
+ let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
- progress.becomeCurrentWithPendingUnitCount(1)
- try Zip.unzipFile(filePath, destination: documentsFolder, overwrite: true, password: "password", progress: nil)
+ progress.becomeCurrent(withPendingUnitCount: 1)
+ try Zip.unzipFile(filePath, destination: documentsFolder as URL, overwrite: true, password: "password", progress: nil)
progress.resignCurrent()
XCTAssertTrue(progress.totalUnitCount == progress.completedUnitCount)
@@ -119,16 +119,16 @@ class ZipTests: XCTestCase {
func testImplicitProgressZip() {
do {
- let progress = NSProgress()
+ let progress = Progress()
progress.totalUnitCount = 1
- let imageURL1 = NSBundle(forClass: ZipTests.self).URLForResource("3crBXeO", withExtension: "gif")!
- let imageURL2 = NSBundle(forClass: ZipTests.self).URLForResource("kYkLkPf", withExtension: "gif")!
- let documentsFolder = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
- let zipFilePath = documentsFolder.URLByAppendingPathComponent("archive.zip")
+ let imageURL1 = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
+ let imageURL2 = Bundle(for: ZipTests.self).url(forResource: "kYkLkPf", withExtension: "gif")!
+ let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
+ let zipFilePath = documentsFolder.appendingPathComponent("archive.zip")
- progress.becomeCurrentWithPendingUnitCount(1)
- try Zip.zipFiles([imageURL1, imageURL2], zipFilePath: zipFilePath, password: nil, progress: nil)
+ progress.becomeCurrent(withPendingUnitCount: 1)
+ try Zip.zipFiles([imageURL1, imageURL2], zipFilePath: zipFilePath!, password: nil, progress: nil)
progress.resignCurrent()
XCTAssertTrue(progress.totalUnitCount == progress.completedUnitCount)
@@ -141,11 +141,11 @@ class ZipTests: XCTestCase {
func testQuickZip() {
do {
- let imageURL1 = NSBundle(forClass: ZipTests.self).URLForResource("3crBXeO", withExtension: "gif")!
- let imageURL2 = NSBundle(forClass: ZipTests.self).URLForResource("kYkLkPf", withExtension: "gif")!
+ let imageURL1 = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
+ let imageURL2 = Bundle(for: ZipTests.self).url(forResource: "kYkLkPf", withExtension: "gif")!
let destinationURL = try Zip.quickZipFiles([imageURL1, imageURL2], fileName: "archive")
- let fileManager = NSFileManager.defaultManager()
- XCTAssertTrue(fileManager.fileExistsAtPath(destinationURL.path!))
+ let fileManager = FileManager.default
+ XCTAssertTrue(fileManager.fileExists(atPath:destinationURL.path))
}
catch {
XCTFail()
@@ -154,20 +154,20 @@ class ZipTests: XCTestCase {
func testQuickZipFolder() {
do {
- let fileManager = NSFileManager.defaultManager()
- let imageURL1 = NSBundle(forClass: ZipTests.self).URLForResource("3crBXeO", withExtension: "gif")!
- let imageURL2 = NSBundle(forClass: ZipTests.self).URLForResource("kYkLkPf", withExtension: "gif")!
- let folderURL = NSBundle(forClass: ZipTests.self).bundleURL.URLByAppendingPathComponent("Directory")
- let targetImageURL1 = folderURL.URLByAppendingPathComponent("3crBXeO.gif")
- let targetImageURL2 = folderURL.URLByAppendingPathComponent("kYkLkPf.gif")
- if fileManager.fileExistsAtPath(folderURL.path!) {
- try fileManager.removeItemAtURL(folderURL)
+ let fileManager = FileManager.default
+ let imageURL1 = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
+ let imageURL2 = Bundle(for: ZipTests.self).url(forResource: "kYkLkPf", withExtension: "gif")!
+ let folderURL = Bundle(for: ZipTests.self).bundleURL.appendingPathComponent("Directory")
+ let targetImageURL1 = folderURL.appendingPathComponent("3crBXeO.gif")
+ let targetImageURL2 = folderURL.appendingPathComponent("kYkLkPf.gif")
+ if fileManager.fileExists(atPath:folderURL.path) {
+ try fileManager.removeItem(at: folderURL)
}
- try fileManager.createDirectoryAtURL(folderURL, withIntermediateDirectories: false, attributes: nil)
- try fileManager.copyItemAtURL(imageURL1, toURL: targetImageURL1)
- try fileManager.copyItemAtURL(imageURL2, toURL: targetImageURL2)
+ try fileManager.createDirectory(at: folderURL, withIntermediateDirectories: false, attributes: nil)
+ try fileManager.copyItem(at: imageURL1, to: targetImageURL1)
+ try fileManager.copyItem(at: imageURL2, to: targetImageURL2)
let destinationURL = try Zip.quickZipFiles([folderURL], fileName: "directory")
- XCTAssertTrue(fileManager.fileExistsAtPath(destinationURL.path!))
+ XCTAssertTrue(fileManager.fileExists(atPath:destinationURL.path))
}
catch {
XCTFail()
@@ -177,15 +177,15 @@ class ZipTests: XCTestCase {
func testZip() {
do {
- let imageURL1 = NSBundle(forClass: ZipTests.self).URLForResource("3crBXeO", withExtension: "gif")!
- let imageURL2 = NSBundle(forClass: ZipTests.self).URLForResource("kYkLkPf", withExtension: "gif")!
- let documentsFolder = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
- let zipFilePath = documentsFolder.URLByAppendingPathComponent("archive.zip")
- try Zip.zipFiles([imageURL1, imageURL2], zipFilePath: zipFilePath, password: nil, progress: { (progress) -> () in
+ let imageURL1 = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
+ let imageURL2 = Bundle(for: ZipTests.self).url(forResource: "kYkLkPf", withExtension: "gif")!
+ let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
+ let zipFilePath = documentsFolder.appendingPathComponent("archive.zip")
+ try Zip.zipFiles([imageURL1, imageURL2], zipFilePath: zipFilePath!, password: nil, progress: { (progress) -> () in
print(progress)
})
- let fileManager = NSFileManager.defaultManager()
- XCTAssertTrue(fileManager.fileExistsAtPath(zipFilePath.path!))
+ let fileManager = FileManager.default
+ XCTAssertTrue(fileManager.fileExists(atPath:(zipFilePath?.path)!))
}
catch {
XCTFail()
@@ -194,23 +194,23 @@ class ZipTests: XCTestCase {
func testZipUnzipPassword() {
do {
- let imageURL1 = NSBundle(forClass: ZipTests.self).URLForResource("3crBXeO", withExtension: "gif")!
- let imageURL2 = NSBundle(forClass: ZipTests.self).URLForResource("kYkLkPf", withExtension: "gif")!
- let documentsFolder = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
- let zipFilePath = documentsFolder.URLByAppendingPathComponent("archive.zip")
- try Zip.zipFiles([imageURL1, imageURL2], zipFilePath: zipFilePath, password: "password", progress: { (progress) -> () in
+ let imageURL1 = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
+ let imageURL2 = Bundle(for: ZipTests.self).url(forResource: "kYkLkPf", withExtension: "gif")!
+ let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
+ let zipFilePath = documentsFolder.appendingPathComponent("archive.zip")
+ try Zip.zipFiles([imageURL1, imageURL2], zipFilePath: zipFilePath!, password: "password", progress: { (progress) -> () in
print(progress)
})
- let fileManager = NSFileManager.defaultManager()
- XCTAssertTrue(fileManager.fileExistsAtPath(zipFilePath.path!))
- guard let fileExtension = zipFilePath.pathExtension, let fileName = zipFilePath.lastPathComponent else {
- throw ZipError.UnzipFail
+ let fileManager = FileManager.default
+ XCTAssertTrue(fileManager.fileExists(atPath:(zipFilePath?.path)!))
+ guard let fileExtension = zipFilePath?.pathExtension, let fileName = zipFilePath?.lastPathComponent else {
+ throw ZipError.unzipFail
}
- let directoryName = fileName.stringByReplacingOccurrencesOfString(".\(fileExtension)", withString: "")
- let documentsUrl = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
- let destinationUrl = documentsUrl.URLByAppendingPathComponent(directoryName, isDirectory: true)
- try Zip.unzipFile(zipFilePath, destination: destinationUrl, overwrite: true, password: "password", progress: nil)
- XCTAssertTrue(fileManager.fileExistsAtPath(destinationUrl.path!))
+ let directoryName = fileName.replacingOccurrences(of: ".\(fileExtension)", with: "")
+ let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
+ let destinationUrl = documentsUrl.appendingPathComponent(directoryName, isDirectory: true)
+ try Zip.unzipFile(zipFilePath!, destination: destinationUrl!, overwrite: true, password: "password", progress: nil)
+ XCTAssertTrue(fileManager.fileExists(atPath:(destinationUrl?.path)!))
}
catch {
XCTFail()
@@ -220,16 +220,15 @@ class ZipTests: XCTestCase {
func testQuickUnzipSubDir() {
do {
- let bookURL = NSBundle(forClass: ZipTests.self).URLForResource("bb8", withExtension: "zip")!
+ let bookURL = Bundle(for: ZipTests.self).url(forResource: "bb8", withExtension: "zip")!
let unzipDestination = try Zip.quickUnzipFile(bookURL)
- let fileManager = NSFileManager.defaultManager()
-
- let subDir = unzipDestination.URLByAppendingPathComponent("subDir")
- let imageURL = subDir.URLByAppendingPathComponent("r2W9yu9").URLByAppendingPathExtension("gif")
+ let fileManager = FileManager.default
+ let subDir = unzipDestination.appendingPathComponent("subDir")
+ let imageURL = subDir.appendingPathComponent("r2W9yu9").appendingPathExtension("gif")
- XCTAssertTrue(fileManager.fileExistsAtPath(unzipDestination.path!))
- XCTAssertTrue(fileManager.fileExistsAtPath(subDir.path!))
- XCTAssertTrue(fileManager.fileExistsAtPath(imageURL.path!))
+ XCTAssertTrue(fileManager.fileExists(atPath:unzipDestination.path))
+ XCTAssertTrue(fileManager.fileExists(atPath:subDir.path))
+ XCTAssertTrue(fileManager.fileExists(atPath:imageURL.path))
} catch {
XCTFail()
}
diff --git a/build.sh b/build.sh
index 5c0d7b6cba2bb076654c95dc8572df7d9b06afed..e1a3cae100f7cfeb79829bf4dfc3c1276ba86783 100755
--- a/build.sh
+++ b/build.sh
@@ -1,8 +1,8 @@
#!/bin/bash
# **** Update me when new Xcode versions are released! ****
-PLATFORM="platform=iOS Simulator,OS=9.2,name=iPhone 6"
-SDK="iphonesimulator9.2"
+PLATFORM="platform=iOS Simulator,OS=10.0,name=iPhone 7"
+SDK="iphonesimulator10.0"
# It is pitch black.
@@ -19,12 +19,12 @@ MODE="$1"
if [ "$MODE" = "framework" ]; then
echo "Building and testing Zip."
- xctool \
+ xcodebuild \
-project Zip.xcodeproj \
-scheme Zip \
-sdk "$SDK" \
-destination "$PLATFORM" \
- build test
+ test
trap - EXIT
exit 0
fi
@@ -35,12 +35,11 @@ if [ "$MODE" = "examples" ]; then
for example in examples/*/; do
echo "Building $example."
pod install --project-directory=$example
- xctool \
+ xcodebuild \
-workspace "${example}Sample.xcworkspace" \
-scheme Sample \
-sdk "$SDK" \
- -destination "$PLATFORM" \
- build
+ -destination "$PLATFORM"
done
trap - EXIT
exit 0
diff --git a/examples/Sample/Sample.xcodeproj/project.pbxproj b/examples/Sample/Sample.xcodeproj/project.pbxproj
index 7aaa0e3d28ddf3f030789c76ce6a6417dd495cca..d8a737beb3a86efd4dd2de59cbd5ce4597fd124b 100644
--- a/examples/Sample/Sample.xcodeproj/project.pbxproj
+++ b/examples/Sample/Sample.xcodeproj/project.pbxproj
@@ -167,14 +167,16 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0720;
- LastUpgradeCheck = 0720;
+ LastUpgradeCheck = 0800;
ORGANIZATIONNAME = "Roy Marmelstein";
TargetAttributes = {
3430F66C1C45C930007473A6 = {
CreatedOnToolsVersion = 7.2;
+ LastSwiftMigration = 0800;
};
3430F6801C45C930007473A6 = {
CreatedOnToolsVersion = 7.2;
+ LastSwiftMigration = 0800;
TestTargetID = 3430F66C1C45C930007473A6;
};
};
@@ -283,8 +285,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -311,6 +315,7 @@
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 3.0;
};
name = Debug;
};
@@ -327,8 +332,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -347,6 +354,8 @@
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ SWIFT_VERSION = 3.0;
VALIDATE_PRODUCT = YES;
};
name = Release;
@@ -354,6 +363,7 @@
3430F68B1C45C930007473A6 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = Sample/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@@ -365,6 +375,7 @@
3430F68C1C45C930007473A6 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = Sample/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
diff --git a/examples/Sample/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme b/examples/Sample/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme
index 4d43f071932c8c5260ce090cfa9c6e89a216ed41..cc659cfd10fb96b79a8b5581ec98b6411157184c 100644
--- a/examples/Sample/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme
+++ b/examples/Sample/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme
@@ -1,6 +1,6 @@
Bool {
- if NSUserDefaults.standardUserDefaults().boolForKey("firstLaunch") == false {
- NSUserDefaults.standardUserDefaults().setBool(true, forKey: "firstLaunch")
- NSUserDefaults.standardUserDefaults().synchronize()
- let fileManager = NSFileManager.defaultManager()
+
+ func applicationDidFinishLaunching(_ application: UIApplication) {
+ if UserDefaults.standard.bool(forKey: "firstLaunch") == false {
+ UserDefaults.standard.set(true, forKey: "firstLaunch")
+ UserDefaults.standard.synchronize()
+ let fileManager = FileManager.default
let fileNames = ["Image1.jpg", "Image2.jpg", "Image3.jpg", "Images.zip"]
- let documentsUrl = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
- let bundleUrl = NSBundle.mainBundle().resourceURL
+ let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
+ let bundleUrl = Bundle.main.resourceURL
for file in fileNames {
- if let srcPath = bundleUrl?.URLByAppendingPathComponent(file).path, let toPath = documentsUrl.URLByAppendingPathComponent(file).path{
+ if let srcPath = bundleUrl?.appendingPathComponent(file).path{
+ let toPath = documentsUrl.appendingPathComponent(file).path
do {
- try fileManager.copyItemAtPath(srcPath, toPath: toPath)
+ try fileManager.copyItem(atPath: srcPath, toPath: toPath)
} catch {}
}
}
}
- // Override point for customization after application launch.
- return true
}
- func applicationWillResignActive(application: UIApplication) {
+ func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- func applicationDidEnterBackground(application: UIApplication) {
+ func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
- func applicationWillEnterForeground(application: UIApplication) {
+ func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
- func applicationDidBecomeActive(application: UIApplication) {
+ func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- func applicationWillTerminate(application: UIApplication) {
+ func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
diff --git a/examples/Sample/Sample/FileBrowser.swift b/examples/Sample/Sample/FileBrowser.swift
index b1915e33514467b218cc2b3a20ddd6444999b9f4..78c49e65ac8b8914583d2a149992e3ae7e2c8a03 100644
--- a/examples/Sample/Sample/FileBrowser.swift
+++ b/examples/Sample/Sample/FileBrowser.swift
@@ -17,9 +17,9 @@ class FileBrowser: UIViewController, UITableViewDataSource, UITableViewDelegate
@IBOutlet weak var zipButton: UIBarButtonItem!
@IBOutlet weak var unzipButton: UIBarButtonItem!
- let fileManager = NSFileManager.defaultManager()
+ let fileManager = FileManager.default
- var path: NSURL? {
+ var path: URL? {
didSet {
updateFiles()
}
@@ -34,7 +34,7 @@ class FileBrowser: UIViewController, UITableViewDataSource, UITableViewDelegate
override func viewDidLoad() {
if self.path == nil {
- let documentsUrl = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
+ let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
self.path = documentsUrl
}
updateSelection()
@@ -47,65 +47,65 @@ class FileBrowser: UIViewController, UITableViewDataSource, UITableViewDelegate
var tempFiles = [String]()
do {
self.title = filePath.lastPathComponent
- tempFiles = try self.fileManager.contentsOfDirectoryAtPath(filePath.path!)
+ tempFiles = try self.fileManager.contentsOfDirectory(atPath: filePath.path)
} catch {
- if path == "/System" {
+ if filePath.path == "/System" {
tempFiles = ["Library"]
}
- if path == "/Library" {
+ if filePath.path == "/Library" {
tempFiles = ["Preferences"]
}
- if path == "/var" {
+ if filePath.path == "/var" {
tempFiles = ["mobile"]
}
- if path == "/usr" {
+ if filePath.path == "/usr" {
tempFiles = ["lib", "libexec", "bin"]
}
}
- self.files = tempFiles.sort(){$0 < $1}
+ self.files = tempFiles.sorted(){$0 < $1}
tableView.reloadData()
}
}
//MARK: UITableView Data Source and Delegate
- func numberOfSectionsInTableView(tableView: UITableView) -> Int {
+ func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
- func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return files.count
}
- func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
+ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "FileCell"
- var cell = UITableViewCell(style: .Subtitle, reuseIdentifier: cellIdentifier)
- if let reuseCell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) {
+ var cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier)
+ if let reuseCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) {
cell = reuseCell
}
guard let path = path else {
return cell
}
- cell.selectionStyle = .None
- let filePath = files[indexPath.row]
- let newPath = path.URLByAppendingPathComponent(filePath).path!
+ cell.selectionStyle = .none
+ let filePath = files[(indexPath as NSIndexPath).row]
+ let newPath = path.appendingPathComponent(filePath).path
var isDirectory: ObjCBool = false
- fileManager.fileExistsAtPath(newPath, isDirectory: &isDirectory)
- cell.textLabel?.text = files[indexPath.row]
- if isDirectory {
+ fileManager.fileExists(atPath: newPath, isDirectory: &isDirectory)
+ cell.textLabel?.text = files[(indexPath as NSIndexPath).row]
+ if isDirectory.boolValue {
cell.imageView?.image = UIImage(named: "Folder")
}
else {
cell.imageView?.image = UIImage(named: "File")
}
- cell.backgroundColor = (selectedFiles.contains(filePath)) ? UIColor(white: 0.9, alpha: 1.0):UIColor.whiteColor()
+ cell.backgroundColor = (selectedFiles.contains(filePath)) ? UIColor(white: 0.9, alpha: 1.0):UIColor.white
return cell
}
- func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
- let filePath = files[indexPath.row]
- if let index = selectedFiles.indexOf(filePath) where selectedFiles.contains(filePath) {
- selectedFiles.removeAtIndex(index)
+ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+ let filePath = files[(indexPath as NSIndexPath).row]
+ if let index = selectedFiles.index(of: filePath) , selectedFiles.contains(filePath) {
+ selectedFiles.remove(at: index)
}
else {
selectedFiles.append(filePath)
@@ -117,29 +117,29 @@ class FileBrowser: UIViewController, UITableViewDataSource, UITableViewDelegate
tableView.reloadData()
selectionCounter.title = "\(selectedFiles.count) Selected"
- zipButton.enabled = (selectedFiles.count > 0)
+ zipButton.isEnabled = (selectedFiles.count > 0)
if (selectedFiles.count == 1) {
let filePath = selectedFiles.first
- let pathExtension = path!.URLByAppendingPathComponent(filePath!).pathExtension
+ let pathExtension = path!.appendingPathComponent(filePath!).pathExtension
if pathExtension == "zip" {
- unzipButton.enabled = true
+ unzipButton.isEnabled = true
}
else {
- unzipButton.enabled = false
+ unzipButton.isEnabled = false
}
}
else {
- unzipButton.enabled = false
+ unzipButton.isEnabled = false
}
}
//MARK: Actions
- @IBAction func unzipSelection(sender: AnyObject) {
+ @IBAction func unzipSelection(_ sender: AnyObject) {
let filePath = selectedFiles.first
- let pathURL = path!.URLByAppendingPathComponent(filePath!)
+ let pathURL = path!.appendingPathComponent(filePath!)
do {
- try Zip.quickUnzipFile(pathURL)
+ let _ = try Zip.quickUnzipFile(pathURL)
self.selectedFiles.removeAll()
updateSelection()
updateFiles()
@@ -148,13 +148,13 @@ class FileBrowser: UIViewController, UITableViewDataSource, UITableViewDelegate
}
}
- @IBAction func zipSelection(sender: AnyObject) {
- var urlPaths = [NSURL]()
+ @IBAction func zipSelection(_ sender: AnyObject) {
+ var urlPaths = [URL]()
for filePath in selectedFiles {
- urlPaths.append(path!.URLByAppendingPathComponent(filePath))
+ urlPaths.append(path!.appendingPathComponent(filePath))
}
do {
- try Zip.quickZipFiles(urlPaths, fileName: "Archive")
+ let _ = try Zip.quickZipFiles(urlPaths, fileName: "Archive")
self.selectedFiles.removeAll()
updateSelection()
updateFiles()
diff --git a/examples/Sample/SampleTests/SampleTests.swift b/examples/Sample/SampleTests/SampleTests.swift
index e2939801ceb5b392aadbd91a8fe2aad64100add2..38fa1d66d3845df5f3261a9afc5354edec3e555d 100644
--- a/examples/Sample/SampleTests/SampleTests.swift
+++ b/examples/Sample/SampleTests/SampleTests.swift
@@ -28,7 +28,7 @@ class SampleTests: XCTestCase {
func testPerformanceExample() {
// This is an example of a performance test case.
- self.measureBlock {
+ self.measure {
// Put the code you want to measure the time of here.
}
}