Return to Snippet

Revision: 2616
at March 14, 2007 13:38 by tgunr


Initial Code
/*


When you want to save your document as a Zip file.

using
cocoadev.com
http://www.cocoadev.com/index.pl?UsingZipFilesExamples


Please change the scratch folder etc to appropriate ones.

*/


-(void)usageExample
{
// create sample data
NSString* text = @"test";
NSData* data = [text dataUsingEncoding:NSUTF8StringEncoding];



// Zip test 1

/*
NSData* convertedData = [self zip:data];

[convertedData writeToFile:[NSHomeDirectory() stringByAppendingPathComponent: @"Desktop/zip result"] atomically:YES];


*/

// Zip test 2

NSFileWrapper* zipwrap = [[[NSFileWrapper alloc] initDirectoryWithFileWrappers:NULL ] autorelease];

[zipwrap addRegularFileWithContents:data preferredFilename:@"data1" ];
[zipwrap addRegularFileWithContents:data preferredFilename:@"data2" ];

NSData* convertedData = [self zip:zipwrap];

[convertedData writeToFile:[NSHomeDirectory() stringByAppendingPathComponent: @"Desktop/zip result"] atomically:YES];




// Unzip

NSFileWrapper* wrapper = [self unzip:convertedData];

if( [wrapper isRegularFile] )
{
NSLog(@"this is a regular file wrapper");


}
else
{
NSLog(@"this is a directory wrapper");


NSDictionary* regularFileWrappers = [wrapper fileWrappers];

NSLog(@"contains %@", [[regularFileWrappers allKeys] description] );

}

[wrapper writeToFile:[NSHomeDirectory() stringByAppendingPathComponent: @"Desktop/unzip result"] atomically:YES updateFilenames:YES];

}



-(NSData*)zip:(id)raw //raw must be NSData or NSFileWrapper
{
NSString* scratchFolder =[NSHomeDirectory() stringByAppendingPathComponent: @"Desktop/"];


NSString* sourceFilename = @"data";
NSString* targetFilename = @"zipped data";

NSString* sourcePath =[scratchFolder stringByAppendingPathComponent: sourceFilename];
NSString* targetPath =[scratchFolder stringByAppendingPathComponent: targetFilename];


BOOL flag = NO;


if( [raw isKindOfClass:[NSData class]] )
flag = [raw writeToFile:sourcePath atomically:YES];


else if( [raw isKindOfClass:[NSFileWrapper class]] )
flag = [raw writeToFile:sourcePath atomically:YES updateFilenames:YES];


if( flag == NO )
{
NSLog(@"Fail to write.");
return NULL;
}

/* Assumes sourcePath and targetPath are both
valid, standardized paths. */



//----------------
// Create the zip task
NSTask * backupTask = [[NSTask alloc] init];
[backupTask setLaunchPath:@"/usr/bin/ditto"];
[backupTask setArguments:
[NSArray arrayWithObjects:@"-c", @"-k", @"-X", @"--rsrc",
sourcePath, targetPath, nil]];

// Launch it and wait for execution
[backupTask launch];
[backupTask waitUntilExit];

// Handle the task's termination status
if ([backupTask terminationStatus] != 0)
{
NSLog(@"Sorry, didn't work.");
return NULL;
}

// You *did* remember to wash behind your ears ...
// ... right?
[backupTask release];


NSData* convertedData = [[[NSData alloc] initWithContentsOfFile:targetPath] autorelease];

//delete scratch

[[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceDestroyOperation
source:scratchFolder
destination:@""
files:[NSArray arrayWithObjects:sourceFilename, targetFilename,NULL]
tag:NULL];


return convertedData;
}


-(NSFileWrapper*)unzip:(NSData*)zipData
{
NSString* scratchFolder =[NSHomeDirectory()
stringByAppendingPathComponent: @"Desktop/"];

NSString* sourceFilename = @"zipped data";
NSString* targetFilename = @"unzipped folder";

NSString* sourcePath =[scratchFolder stringByAppendingPathComponent: sourceFilename];
NSString* targetPath =[scratchFolder stringByAppendingPathComponent: targetFilename];



BOOL flag = [zipData writeToFile:sourcePath atomically:YES];

if( flag == NO )
{
NSLog(@"error");
return NULL;
}


//Unzip

//-------------------
NSTask *cmnd=[[NSTask alloc] init];
[cmnd setLaunchPath:@"/usr/bin/ditto"];
[cmnd setArguments:[NSArray arrayWithObjects:
@"-v",@"-x",@"-k",@"--rsrc",sourcePath,targetPath,nil]];
[cmnd launch];
[cmnd waitUntilExit];

// Handle the task's termination status
if ([cmnd terminationStatus] != 0)
{
NSLog(@"Sorry, didn't work.");
return NULL;
}

// You *did* remember to wash behind your ears ...
// ... right?
[cmnd release];



//unzip
//

NSArray* contents = [[NSFileManager defaultManager] directoryContentsAtPath:targetPath];


NSFileWrapper* wrapper;

if( [contents count] == 1 )
{
NSString* onepath;
onepath = [targetPath stringByAppendingPathComponent:[contents lastObject]];

NSData* data = [NSData dataWithContentsOfFile:onepath];

wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:data ] autorelease];


}
else if( [contents count] > 1 )
{

wrapper = [[[NSFileWrapper alloc] initDirectoryWithFileWrappers:NULL ] autorelease];

unsigned hoge;
for( hoge = 0; hoge < [contents count]; hoge++ )
{
NSString* onepath;
NSString* onefilename;

onefilename = [contents objectAtIndex:hoge];
onepath = [targetPath stringByAppendingPathComponent:onefilename];

NSData* data = [NSData dataWithContentsOfFile:onepath];

[wrapper addRegularFileWithContents:data preferredFilename:onefilename ];
}
}



//delete scratch

[[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceDestroyOperation
source:scratchFolder
destination:@""
files:[NSArray arrayWithObjects:sourceFilename, targetFilename,NULL]
tag:NULL];


return wrapper;
}

Initial URL
http://homepage.mac.com/mnishikata/page2/page2.html

Initial Description


Initial Title
Create Zip file from data which user can unarchive

Initial Tags
osx

Initial Language
Other