我一直在努力寻找解决方案来完成一项非常简单的任务。我需要将某种类型的文件(在这种情况下为所有zip文件)移动到另一个目录中。我已经尝试过NSTask和NSFileManager但是空了。我可以一次移动一个,但我想同时移动它们。
- (void)copyFilesTo :(NSString*)thisPath {
NSFileManager *manager = [NSFileManager defaultManager];
NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:thisPath];
NSString *filename = nil;
while ((filename = [direnum nextObject] )) {
if ([filename hasSuffix:@".zip"]) {
[fileManager copyItemAtPath:thisPath toPath:newPath];
}
}
}
失败 - 文件已复制= zeroooo
- (void)copyFilesMaybe :(NSString*)thisPath {
newPath = [newPath stringByAppendingPathComponent:fileName];
task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/find"];
[task waitUntilExit];
NSArray *arguments;
arguments = [NSArray arrayWithObjects: thisPath, @"-name", @"*.zip", @"-exec", @"cp", @"-f", @"{}", newPath, @"\\", @";", nil];
[task setArguments: arguments];
NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[task launch];
}
同样悲惨的结果,没有复制文件。我到底做错了什么?
答案 0 :(得分:1)
在第一种情况下,您在复制通话中没有使用filename
。您需要通过将filename
与thisPath
组合并尝试复制该文件来构建文件的完整路径。此外,该方法是-copyItemAtPath:toPath:error:
。你没有最后一个参数。尝试:
NSError* error;
if (![fileManager copyItemAtPath:[thisPath stringByAppendingPathComponent:filename] toPath:newPath error:&error])
// handle error (at least log error)
在第二种情况下,我认为你的arguments
数组是错误的。我不确定为什么它包含@"\\"
。我怀疑因为在shell中你必须用反斜杠(\;
)来转义分号。但是,需要转义分号是因为shell会解释它而不会将其传递给find
。由于您不使用shell,因此您不需要这样做。 (另外,如果你确实需要转义它,它不应该是arguments数组的一个单独元素。它与分号在同一个元素中,如@"\\;"
。)
此外,您确定任务已完成吗?您显示启动但您没有显示观察或等待其终止。鉴于您已为其输出设置管道,您必须从该管道读取以确保子流程不会卡在其上。
我不确定您在启动任务之前调用-waitUntilExit
的原因。但这可能是无害的。