NSTask 在实际工程中的使用

最近工程需要实现一个大文件的copy,需要显示进度和以及取消操作。


进度根据原文件大小,定时器算实时拷贝文件的大小的比例可以算出,这里主要是处理取消操作


1.原本尝试用

NSString * sourcePath nil;   // 原路径

NSString * destination = nil; // 目的路径

[[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:destionation error:nil];

因为这种写法无法处理取消,点击取消后,实际上copy还在继续进行。


2.NSTask的使用

xcode 创建一个命令行可执行文件(CMLTool),里面执行copy操作,通过NSTask将输入输出路径作为参数传入。


执行task


NSTask * task = [NSTask launchCMLTask:@"copy" arguments:[NSArray arrayWithObjects:source,dest, nil]];

[task launch];

[task waitUntilExit];


+ (NSTask *)launchCMLTask:(NSString *)action arguments:(NSArray *)arg{

    NSTask *task = [[NSTask new] autorelease];


    NSString *path=[[[[NSBundle mainBundle] executablePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"CMLTool"];

    NSArray *arguments=[NSArray arrayWithObjects:action, nil];

    arguments=[arguments arrayByAddingObjectsFromArray:arg];


    [task setLaunchPath:path];

    [task setArguments:arguments];

    

    return task;

}


这样在copy通过NSTask执行copy操作的时候,可以cancel

[task terminate];

你可能感兴趣的:(Mac,os)