2014-03-29 5 views
1

저는 매우 간단한 작업을 수행하는 솔루션을 찾기 위해 애 쓰고 있습니다. 특정 유형의 파일 (이 경우 모든 zip 파일)을 다른 디렉토리로 이동해야합니다. 나는 NSTask와 NSFileManager를 시도했지만 비어있다. 한 번에 하나씩 이동할 수는 있지만 동시에 한 번에 이동하려고합니다.NSFileManager 또는 NSTask 파일 형식 이동

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

첫 번째 경우에는 복사 호출에 filename이 사용되지 않습니다. filenamethisPath과 결합하여 복사하려고하면 파일의 전체 경로를 만들어야합니다. 또한 방법은 -copyItemAtPath:toPath:error:입니다. 마지막 매개 변수를 중단했습니다. 시도하십시오 :

  NSError* error; 
      if (![fileManager copyItemAtPath:[thisPath stringByAppendingPathComponent:filename] toPath:newPath error:&error]) 
       // handle error (at least log error) 

두 번째 경우에는 귀하의 arguments 배열이 잘못되었다고 생각합니다. 나는 그것이 왜 @"\\"을 포함하는지 잘 모르겠습니다. 나는 쉘에서 세미콜론을 백 슬래시 (\;)로 이스케이프 처리해야하기 때문에 의심 스럽습니다. 그러나 세미콜론을 벗어날 필요가있는 이유는 쉘이 달리 해석하고 find으로 전달하지 않기 때문입니다. 쉘을 사용하지 않으므로 그렇게하지 않아도됩니다. 또한 이스케이프해야하는 경우 인수 배열의 별도 요소가 아니어야하며 세미콜론과 동일한 요소 (예 : @"\\;")가 있어야합니다.

완료 됐습니까? 당신은 발사를 보여 주지만 당신은 관찰을 보이지 않거나 그것의 종료를 기다리지 않는다. 출력을 위해 파이프를 설정 했으므로 파이프에서 읽어야 서브 프로세스가 파이프에 쓰여지는 것을 막을 수 있습니다.

작업을 시작하기 전에 -waitUntilExit으로 전화하는 이유가 확실하지 않습니다. 그것은 무해 할 수도 있습니다.

+0

감사합니다. Ken, 많이 도움이됩니다. :) –