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 (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to