• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: NSTask with unzip
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: NSTask with unzip


  • Subject: Re: NSTask with unzip
  • From: Dave DeLong <email@hidden>
  • Date: Sat, 27 Nov 2010 08:48:34 -0800

The way I get around this is to use an NSFileHandle for standard out instead of an NSPipe. It's a bit less efficient, but slightly more convenient.

Dave

Sent from my iPhone

On Nov 27, 2010, at 7:59 AM, Ben Haller <email@hidden> wrote:

> 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
_______________________________________________

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

  • Follow-Ups:
    • Re: NSTask with unzip
      • From: "gMail.com" <email@hidden>
    • Re: NSTask with unzip
      • From: Ben Haller <email@hidden>
References: 
 >NSTask with unzip (From: "gMail.com" <email@hidden>)
 >Re: NSTask with unzip (From: Ben Haller <email@hidden>)

  • Prev by Date: Core data binding "first" of to-many relationship
  • Next by Date: Re: iOS - Help with nasty memory leak
  • Previous by thread: Re: NSTask with unzip
  • Next by thread: Re: NSTask with unzip
  • Index(es):
    • Date
    • Thread