Re: NSTask with unzip
Re: NSTask with unzip
- Subject: Re: NSTask with unzip
- From: Ben Haller <email@hidden>
- Date: Sat, 27 Nov 2010 10:59:20 -0500
On 2010-11-26, at 7:33 AM, gMail.com wrote:
> Hi, I can properly unzip a zip file launching a NSTask with /usr/bin/unzip
> The task saves the unzipped file to the disk, then a I read the unzipped
> file in a NSData. Well. My question is:
> Can I do the same job without saving the unzipped file to the disk?
>
> I have tried to set the standard output to a pipe - which works well with
> other tasks - but here it doesn't work. The task never exits. Here's the
> wrong code:
>
> NSTask *unzip = [[[NSTask alloc] init] autorelease];
> [unzip setLaunchPath:@"/usr/bin/unzip"];
> [unzip setArguments:[NSArray arrayWithObjects:@"-p", zipfile,
> @"filetounzip", nil]];
>
> NSPipe *aPipe = [NSPipe pipe];
> [unzip setStandardOutput:aPipe];
> [unzip launch];
> [unzip waitUntilExit];
>
> if([unzip terminationStatus] == noErr){
> dictData = [NSMutableData data];
> while((dataOut = [aPipe availableData]) && [dataOut length]){
> [dictData appendData:dataOut];
> }
> }
If I recall correctly, the problem is likely to be your use of -waitUntilExit. That API should apparently have a large red label on it ("Warnin', lark's vomit!") since everybody wants to use it this way. The problem is that the task's output pipe fills up because it isn't being serviced, and then things get locked up. You need to go with asynchronous reads to service the pipe as output gets stuffed into it. There should be lots of examples of this on this list, now that you know what to look for.
What would be great would be a new call, along the lines of -dataFromWaitingUntilExit or some such, that does all this for you, since this is so commonly what people want to do.
Ben Haller
McGill University
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden