DotMac

プログラムに関する覚え書き等

Create Zip file from data which user can unarchive

/*



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;

}


 

Parting Words (著作権, 連絡先情報, etc.)