外部プログラムの実行結果を文字列で取り込む

Shell や Perl などで `file anyfile` のように記述して、外部プログラムの実行結果(標準出力)を文字列で取り込むことがありますが、これをプログラムから行なうサンプルです。(処理効率やエラー処理は未検討ですが。)

NSTask と NSPipe を使うと簡単にできます。

NSString+Task.h

//  NSString+Task.h

#import 

@interface NSString (Task)

+ (NSString *)stringWithRunningTask:(NSString *)taskPath arguments:(NSArray *)arguments;

@end

NSString+Task.m

//  NSString+Task.m

#import "NSString+Task.h"

@implementation NSString (Task)

+ (NSString *)stringWithRunningTask:(NSString *)taskPath arguments:(NSArray *)arguments
{
    NSTask *aTask = [[NSTask alloc] init];
    NSPipe *pipe = [NSPipe pipe];
    
    [aTask setLaunchPath:taskPath];
    [aTask setArguments:arguments];
    [aTask setStandardOutput:pipe];
    [aTask launch];
    
    NSFileHandle *readHandle = [pipe fileHandleForReading];
    NSData *inData = nil;
    NSMutableData *allData = [[NSMutableData alloc] init];
    
    while ((inData = [readHandle availableData]) && [inData length]) {
        [allData appendData:inData];
    }

    [aTask waitUntilExit];

    NSString *string = [[NSString alloc] initWithData:allData encoding:NSUTF8StringEncoding];
    
    return string;
}

@end
カテゴリー: 開発 Tips (31): Objective-C, 開発 Tips (42): Framework -- Foundation タグ: , パーマリンク

コメントは停止中です。