2013-12-19 69 views
12

使用下面的線,如何在複製時使用[NSfilemanager defaultmanager]覆蓋文件夾?

[fileManager copyItemAtPath:sourcePath toPath:targetPath error:&error]; 

我們可以複製一個文件夾,但如果該文件夾已經存在,它拋出一個異常「文件存在」。 爲了覆蓋單個文件,我們可以通過以下幾行實現它:

NSData *myData = [NSData dataWithContentsOfURL:FileURL]; /fetch single file 
[myData writeToFile:targetPath atomically:YES]; 

但我想複製一個已經存在的文件夾,即,覆蓋

編輯: 簡單的可能性,我可以在複製它們之前刪除項目。

請提出任何更多的可能性。

+2

請檢查此: - http://stackoverflow.com/questions/6137423/how-to-overwrite-a-file-with-nsfilemanager-when-copying –

回答

10

NSFileManager方法的默認行爲是拋出異常/錯誤「文件是否存在。」當文件存在時。但仍然,如果要覆蓋使用NSFileManager那麼它提供了一個API,爲它下面replaceItemAtURL在第一方案中提到還有: -

也有三種解決方案,以實現這一

首個解決方案

[filemanger replaceItemAtURL:url1 
       withItemAtURL:url2 
       backupItemName:@"/Users/XYZ/Desktop/test.xml" 
        options:NSFileManagerItemReplacementUsingNewMetadataOnly 
      resultingItemURL:nil error:nil]; 

使用上面的API可以覆蓋文件內容。但在此之前,您必須在臨時目錄中備份源路徑。

第二種解決

已經你已經在你的問題使用NSData writeToUrl提及。

第三解決方案

trojanfoe在their answer.即提到刪除該項目被預先覆蓋。

+0

很抱歉接受(巨大)延遲。長時間休息後回來。也許,這個賞金將補償:) – itechnician

3

第一刪除的項目,具有:

[fileManager removeItemAtPath:targetPath error:NULL]; 

(即忽略任何錯誤)

+0

感謝您的迴應。對於複製我的文件夾,它會在設備中消耗約10秒。然後,在我的情況下,如果我刪除了相同的內容,則操作時間將加倍。 – itechnician

+0

-1:爲什麼你會忽略錯誤?如果您無權刪除該項目,該怎麼辦?至少它應該被記錄到控制檯。 –

+0

@CraigOtis它將被下一行代碼捕獲(由OP提供)。 – trojanfoe

0
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
     [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil]; 
+1

請解釋一下它在做什麼? – doptimusprime

+0

首先檢查文件是否存在,如果是,則刪除文件。這會忽略錯誤---在[fileManager copyItemAtPath:sourcePath toPath:targetPath error:&error]後使用; –

5

我想補充一個使用委託,以覆蓋與copyItemAtPath(的NSFileManager)函數使用的文件:

[[NSFileManager defaultManager] setDelegate:self]; 
[[NSFileManager defaultManager] copyItemAtPath:fileOrigin toPath:fileDestin error:&error]; 

和落實代表可選功能:

- (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error copyingItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath{ 
    if ([error code] == NSFileWriteFileExistsError) //error code for: The operation couldn’t be completed. File exists 
     return YES; 
    else 
     return NO; 
} 
相關問題