2014-03-29 72 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數組是錯誤的。我不確定它爲什麼包括@"\\"。我懷疑是因爲在shell中你必須用反斜槓(\;)來跳過分號。但是,需要跳過分號是因爲shell會解釋它,而不是將它傳遞給find。既然你沒有使用shell,你不需要這樣做。 (另外,如果你確實需要轉義它,它不應該是參數數組的單獨元素,它應該與分號相同,如@"\\;"。)

另外,你確定任務已經完成?你展示了發佈,但你沒有表現出觀察或等待終止。考慮到你已經爲它的輸出設置了一個管道,你必須從管道讀取,以確保子過程不會被寫入到它。

我不確定您在啓動任務之前爲什麼要撥打-waitUntilExit。不過,這可能是無害的。

+0

謝謝Ken,mucho有用:) –