NSFileManager或NSTask移动文件类型

时间:2014-03-29 17:17:09

标签: objective-c macos cocoa nsfilemanager nstask

我一直在努力寻找解决方案来完成一项非常简单的任务。我需要将某种类型的文件(在这种情况下为所有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];

}

同样悲惨的结果,没有复制文件。我到底做错了什么?

1 个答案:

答案 0 :(得分:1)

在第一种情况下,您在复制通话中没有使用filename。您需要通过将filenamethisPath组合并尝试复制该文件来构建文件的完整路径。此外,该方法是-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的原因。但这可能是无害的。