Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ed48f8e04 | ||
|
|
6797222f63 | ||
|
|
f1f4fee67f | ||
|
|
07288c8e00 |
@@ -140,12 +140,7 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 1: reading from first file's stream...")
|
||||
|
||||
let data1 = NSMutableData(length:256)!
|
||||
|
||||
var error : NSError?
|
||||
let bytesRead1 = read1.readDataWithBuffer(data1, error:&error)
|
||||
if error != nil {
|
||||
throw error!
|
||||
}
|
||||
let bytesRead1 = try read1.readDataWithBuffer(data1)
|
||||
|
||||
XCTAssertEqual(3, bytesRead1)
|
||||
|
||||
@@ -167,11 +162,7 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 1: reading from second file's stream...")
|
||||
|
||||
let data2 = NSMutableData(length:256)!
|
||||
|
||||
let bytesRead2 = read2.readDataWithBuffer(data2, error:&error)
|
||||
if error != nil {
|
||||
throw error!
|
||||
}
|
||||
let bytesRead2 = try read2.readDataWithBuffer(data2)
|
||||
|
||||
XCTAssertEqual(3, bytesRead2)
|
||||
|
||||
@@ -201,11 +192,11 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Uncomment to execute this test, but be careful: takes 5 minutes and consumes 5 GB of disk space
|
||||
*
|
||||
func test02ZipAndUnzip5GB() {
|
||||
|
||||
// TODO Remove to enable this test, but be careful: takes 5 minutes and consumes 5 GB of disk space
|
||||
return
|
||||
|
||||
let documentsUrl = NSURL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).URLByAppendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.URLByAppendingPathComponent("huge_test.zip")
|
||||
let filePath = fileUrl.path!
|
||||
@@ -286,13 +277,9 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 2: reading from file's stream...")
|
||||
|
||||
for (var i = 0; i < HUGE_TEST_NUMBER_OF_BLOCKS; i++) {
|
||||
var error : NSError?
|
||||
let bytesRead = read.readDataWithBuffer(buffer, error:&error)
|
||||
if error != nil {
|
||||
throw error!
|
||||
}
|
||||
let bytesRead = try read.readDataWithBuffer(buffer)
|
||||
|
||||
XCTAssertEqual(UInt(data.length), bytesRead)
|
||||
XCTAssertEqual(data.length, bytesRead)
|
||||
|
||||
let range = buffer.rangeOfData(checkData, options:NSDataSearchOptions(), range:NSMakeRange(0, buffer.length))
|
||||
|
||||
@@ -319,6 +306,7 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey])")
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func test03UnzipMacZipFile() -> () {
|
||||
let documentsUrl = NSURL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).URLByAppendingPathComponent("Documents")
|
||||
@@ -355,12 +343,7 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 3: reading from file's stream...")
|
||||
|
||||
let buffer = NSMutableData(length:1024)!
|
||||
|
||||
var error : NSError?
|
||||
let bytesRead = read.readDataWithBuffer(buffer, error:&error)
|
||||
if error != nil {
|
||||
throw error!
|
||||
}
|
||||
let bytesRead = try read.readDataWithBuffer(buffer)
|
||||
|
||||
let fileText = NSString(bytes:buffer.bytes, length:Int(bytesRead), encoding:NSUTF8StringEncoding)
|
||||
|
||||
@@ -418,12 +401,7 @@ class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
NSLog("Test 4: reading from file's stream...")
|
||||
|
||||
let buffer = NSMutableData(length:1024)!
|
||||
|
||||
var error : NSError?
|
||||
let bytesRead = read.readDataWithBuffer(buffer, error:&error)
|
||||
if error != nil {
|
||||
throw error!
|
||||
}
|
||||
let bytesRead = try read.readDataWithBuffer(buffer)
|
||||
|
||||
let fileText = NSString(bytes:buffer.bytes, length:Int(bytesRead), encoding:NSUTF8StringEncoding)
|
||||
|
||||
|
||||
@@ -208,11 +208,11 @@
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Uncomment to execute this test, but be careful: takes 5 minutes and consumes 5 GB of disk space
|
||||
*
|
||||
- (void) test02ZipAndUnzip5GB {
|
||||
|
||||
// TODO Remove to enable this test, but be careful: takes 5 minutes and consumes 5 GB of disk space
|
||||
return;
|
||||
|
||||
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"huge_test.zip"];
|
||||
|
||||
@@ -319,6 +319,7 @@
|
||||
[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
- (void) test03UnzipMacZipFile {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZFileInZipInfo+Internals.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZFileInZipInfo.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZFileInZipInfo.m
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipCompressionLevel.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipException+Internals.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipException.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipException.m
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipFile+NSError.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
@@ -34,6 +34,17 @@
|
||||
#import "OZZipFile.h"
|
||||
|
||||
|
||||
/**
|
||||
@brief Indicates the file could not be located in the zip file.
|
||||
*/
|
||||
static const NSInteger OZLocateFileResultNotFound= -1;
|
||||
|
||||
/**
|
||||
@brief Indicates the file has been successfully located in the zip file.
|
||||
*/
|
||||
static const NSInteger OZLocateFileResultFound= 1;
|
||||
|
||||
|
||||
@interface OZZipFile (NSError)
|
||||
|
||||
|
||||
@@ -211,13 +222,16 @@
|
||||
<code>readCurrentFileInZip</code>.</p>
|
||||
@param error If passed, may be filled with an NSError is case the file can't
|
||||
be located.
|
||||
@return <code>YES</code> if the file has been located and selected,
|
||||
<code>NO</code> if the specified file name is not present in the zip file or
|
||||
the file could not be located due to an error.
|
||||
@return <code>OZLocateFileResultFound</code> if the file has been located
|
||||
and selected, <code>OZLocateFileResultNotFound</code> if the specified
|
||||
file name is not present in the zip file, or <code>0</code> if the file could
|
||||
not be located due to an error.
|
||||
<br/>NOTE: return value convention is different in the standard (non-NSError
|
||||
compliant) interface.
|
||||
@throws OZZipException If the zip file has been opened with a mode other than
|
||||
Unzip.
|
||||
*/
|
||||
- (BOOL) locateFileInZip:(nonnull NSString *)fileNameInZip error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
- (NSInteger) __attribute__((swift_error(zero_result))) locateFileInZip:(nonnull NSString *)fileNameInZip error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Returns the number of files contained in the zip file.
|
||||
@@ -228,7 +242,7 @@
|
||||
@throws OZZipException If the zip file has been opened with a mode other
|
||||
than Unzip.
|
||||
*/
|
||||
- (NSUInteger) numFilesInZipWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
- (NSUInteger) __attribute__((swift_error(zero_result))) numFilesInZipWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Returns a list of OZFileInZipInfo with the information on all the files
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipFile+Standard.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
@@ -199,6 +199,8 @@
|
||||
<code>readCurrentFileInZip</code>.</p>
|
||||
@return <code>YES</code> if the file has been located and selected,
|
||||
<code>NO</code> if the specified file name is not present in the zip file.
|
||||
<br/>NOTE: return value convention is different in NSError compliant
|
||||
interface.
|
||||
@throws OZZipException If the file can't be located due to an error or if the
|
||||
zip file has been opened with a mode other than Unzip.
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipFile.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipFile.m
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
@@ -444,12 +444,13 @@
|
||||
} ERROR_WRAP_END_AND_RETURN(error, NO);
|
||||
}
|
||||
|
||||
- (BOOL) locateFileInZip:(NSString *)fileNameInZip error:(NSError * __autoreleasing *)error {
|
||||
- (NSInteger) locateFileInZip:(NSString *)fileNameInZip error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self locateFileInZip:fileNameInZip];
|
||||
BOOL located= [self locateFileInZip:fileNameInZip];
|
||||
return (located ? OZLocateFileResultFound : OZLocateFileResultNotFound);
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, NO);
|
||||
} ERROR_WRAP_END_AND_RETURN(error, 0);
|
||||
}
|
||||
|
||||
- (NSUInteger) numFilesInZipWithError:(NSError * __autoreleasing *)error {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipFileMode.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipReadStream+Internals.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipReadStream+NSError.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
@@ -34,6 +34,12 @@
|
||||
#import "OZZipReadStream.h"
|
||||
|
||||
|
||||
/**
|
||||
@brief Indicates the end of the file has been reached.
|
||||
*/
|
||||
static const NSInteger OZReadStreamResultEndOfFile= -1;
|
||||
|
||||
|
||||
@interface OZZipReadStream (NSError)
|
||||
|
||||
|
||||
@@ -46,10 +52,13 @@
|
||||
@param buffer The buffer where read and uncompressed data must be stored.
|
||||
@param error If passed, may be filled with an NSError is case data could
|
||||
not be read.
|
||||
@return The number of uncompressed bytes read, <code>0</code> if the end of
|
||||
the file has been reached or data could not be read due to an error.
|
||||
@return The number of uncompressed bytes read, <code>OZReadStreamResultEndOfFile</code>
|
||||
if the end of the file has been reached, or <code>0</code>
|
||||
if data could not be read due to an error.
|
||||
<br/>NOTE: return value convention is different in the standard (non-NSError
|
||||
compliant) interface.
|
||||
*/
|
||||
- (NSUInteger) readDataWithBuffer:(nonnull NSMutableData *)buffer error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
- (NSInteger) __attribute__((swift_error(zero_result))) readDataWithBuffer:(nonnull NSMutableData *)buffer error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Closes the read steam.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipReadStream+Standard.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
@@ -46,6 +46,8 @@
|
||||
@param buffer The buffer where read and uncompressed data must be stored.
|
||||
@return The number of uncompressed bytes read, <code>0</code> if the end of
|
||||
the file has been reached.
|
||||
<br/>NOTE: return value convention is different in NSError compliant
|
||||
interface.
|
||||
@throws OZZipException If the data could not be read due to an error.
|
||||
*/
|
||||
- (NSUInteger) readDataWithBuffer:(nonnull NSMutableData *)buffer;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipReadStream.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 28/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipReadStream.m
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 28/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
@@ -93,10 +93,11 @@
|
||||
#pragma mark -
|
||||
#pragma mark Reading data (NSError variants)
|
||||
|
||||
- (NSUInteger) readDataWithBuffer:(NSMutableData *)buffer error:(NSError * __autoreleasing *)error {
|
||||
- (NSInteger) readDataWithBuffer:(NSMutableData *)buffer error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self readDataWithBuffer:buffer];
|
||||
NSUInteger bytesRead= [self readDataWithBuffer:buffer];
|
||||
return (bytesRead == 0) ? OZReadStreamResultEndOfFile : bytesRead;
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, 0);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipWriteStream+Internals.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipWriteStream+NSError.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
@@ -47,6 +47,8 @@
|
||||
@param data The data to be compressed and written.
|
||||
@param error If passed, may be filled with an NSError is case data could
|
||||
not be written.
|
||||
@return <code>YES</code> if data has been written, <code>NO</code> if
|
||||
data could not be written due to an error.
|
||||
*/
|
||||
- (BOOL) writeData:(nonnull NSData *)data error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipWriteStream+Standard.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipWriteStream.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// OZZipWriteStream.m
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// Objective-Zip+NSError.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// Objective-Zip.h
|
||||
// Objective-Zip v. 1.0.1
|
||||
// Objective-Zip v. 1.0.2
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2015 Gianluca Bertani. All rights reserved.
|
||||
|
||||
112
README.md
112
README.md
@@ -42,7 +42,7 @@ Adding Objective-Zip to your project
|
||||
The library is distributed via CocoaPods, you can add a dependency in you pod
|
||||
file with the following line:
|
||||
|
||||
pod 'Objective-Zip', '~> 1.0'
|
||||
pod 'objective-zip', '~> 1.0'
|
||||
|
||||
You can then access Objective-Zip classes with the following import
|
||||
statement if you plan to use exception handling:
|
||||
@@ -105,7 +105,10 @@ The OZZipFile class, when used in unzip mode, must be treated like a
|
||||
cursor: you position the instance on a file at a time, either by
|
||||
step-forwarding or by locating the file by name. Once you are on the
|
||||
correct file, you can obtain an instance of a OZZipReadStream that will
|
||||
let you read the content (and then must be closed):
|
||||
let you read the content (and then must be closed).
|
||||
|
||||
Since the file may not fit into memory, you can read it block by block using
|
||||
a buffer:
|
||||
|
||||
```objective-c
|
||||
OZZipFile *unzipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
@@ -114,14 +117,50 @@ OZZipFile *unzipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
[unzipFile goToFirstFileInZip];
|
||||
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:256];
|
||||
int bytesRead= [read readDataWithBuffer:data];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:BUFFER_SIZE];
|
||||
|
||||
do {
|
||||
|
||||
// Reset buffer length
|
||||
[buffer setLength:BUFFER_SIZE];
|
||||
|
||||
// Read bytes and check for end of file
|
||||
int bytesRead= [read readDataWithBuffer:data];
|
||||
if (bytesRead <= 0)
|
||||
break;
|
||||
|
||||
[buffer setLength:bytesRead];
|
||||
|
||||
// Do something with buffer
|
||||
|
||||
} while (YES);
|
||||
|
||||
[read finishedReading];
|
||||
```
|
||||
|
||||
Alternatively, if you know in advance the file will fit into memory, you may
|
||||
preallocate a buffer big enough and read the all file at once. In the example
|
||||
below the buffer is preallocated with precisely the uncompressed size of the
|
||||
file:
|
||||
|
||||
```objective-c
|
||||
OZZipFile *unzipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
mode:OZZipFileModeUnzip];
|
||||
|
||||
[unzipFile goToFirstFileInZip];
|
||||
OZFileInZipInfo *info= [unzipFile getCurrentFileInZipInfo];
|
||||
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:info.length];
|
||||
[read readDataWithBuffer:data];
|
||||
|
||||
// Do something with data
|
||||
|
||||
[read finishedReading];
|
||||
```
|
||||
|
||||
Note that the NSMutableData instance that acts as the read buffer must
|
||||
have been set with a length greater than 0: the readDataWithBuffer API
|
||||
have been set with a length greater than 0: the `readDataWithBuffer` API
|
||||
will use that length to know how many bytes it can fetch from the zip
|
||||
file.
|
||||
|
||||
@@ -148,7 +187,7 @@ for (OZFileInZipInfo *info in infos) {
|
||||
|
||||
// Expand the file in memory
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:256];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:info.length];
|
||||
int bytesRead= [read readDataWithBuffer:data];
|
||||
[read finishedReading];
|
||||
}
|
||||
@@ -182,45 +221,6 @@ rebuild it on the file system (and viceversa during creation). Common
|
||||
zippers/unzippers simply follow this rule.
|
||||
|
||||
|
||||
Memory management
|
||||
-----------------
|
||||
|
||||
If you need to extract huge files that cannot be contained in memory,
|
||||
you can do so using a read-then-write buffered loop like this:
|
||||
|
||||
```objective-c
|
||||
NSFileHandle *file= [NSFileHandle fileHandleForWritingAtPath:filePath];
|
||||
NSMutableData *buffer= [[NSMutableData alloc]
|
||||
initWithLength:BUFFER_SIZE];
|
||||
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
|
||||
// Read-then-write buffered loop
|
||||
do {
|
||||
|
||||
// Reset buffer length
|
||||
[buffer setLength:BUFFER_SIZE];
|
||||
|
||||
// Expand next chunk of bytes
|
||||
int bytesRead= [read readDataWithBuffer:buffer];
|
||||
if (bytesRead > 0) {
|
||||
|
||||
// Write what we have read
|
||||
[buffer setLength:bytesRead];
|
||||
[file writeData:buffer];
|
||||
|
||||
} else
|
||||
break;
|
||||
|
||||
} while (YES);
|
||||
|
||||
// Clean up
|
||||
[file closeFile];
|
||||
[read finishedReading];
|
||||
[buffer release];
|
||||
```
|
||||
|
||||
|
||||
Error handling
|
||||
--------------
|
||||
|
||||
@@ -255,6 +255,21 @@ Apple's NSError pattern is of course mandatory with Swift programming
|
||||
language, since it does not support exception handling.
|
||||
|
||||
|
||||
Differences in the interface
|
||||
----------------------------
|
||||
|
||||
Note that a few minor differences exist in the standard interface vs. the
|
||||
NSError pattern interface. Specifically:
|
||||
|
||||
* `[OZZipFile locateFileInZip:error:]` returns a `NSInteger` in place of a
|
||||
`BOOL`. Here the special values `OZLocateFileResultNotFound` and
|
||||
`OZLocateFileResultNotFound`, respectively `1` and `-1`, are used in place of
|
||||
`YES` and `NO`, since `0` is reserved for the case where an error occurred.
|
||||
* `[OZZipReadStream readDataWithBuffer:error:]` similarly returns a
|
||||
`NSInteger` in place of a `NSUInteger`. Here the special value
|
||||
`OZReadStreamResultEndOfFile`, corresponding to `-1`, is used for the
|
||||
end-of-file case, since `0` is again reserved for error occurrence.
|
||||
|
||||
|
||||
License
|
||||
=======
|
||||
@@ -265,6 +280,11 @@ The library is distributed under the New BSD License.
|
||||
Version history
|
||||
===============
|
||||
|
||||
Version 1.0.2:
|
||||
|
||||
- Fixed interface for `locateFileInZip` and `readDataWithBuffer` in NSError
|
||||
version so that they correctly support Swift error handling.
|
||||
|
||||
Version 1.0.1:
|
||||
|
||||
- Fixed compatibility bugs with Swift
|
||||
@@ -331,7 +351,7 @@ Version 0.7.0:
|
||||
Compatibility
|
||||
=============
|
||||
|
||||
Version 1.0.1 has been tested with iOS up to 9.0 and OS X up to 10.10.5, but
|
||||
Version 1.0.2 has been tested with iOS up to 9.0 and OS X up to 10.11, but
|
||||
should be compatible with earlier versions too, down to iOS 5.1 and OS X 10.7.
|
||||
Le me know of any issues that should arise.
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ Pod::Spec.new do |s|
|
||||
# ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.name = "objective-zip"
|
||||
s.version = "1.0.1"
|
||||
s.version = "1.0.2"
|
||||
s.summary = "An object-oriented friendly wrapper library for ZLib and MiniZip, in Objective-C for iOS and OS X"
|
||||
|
||||
s.description = <<-DESC
|
||||
|
||||
Reference in New Issue
Block a user