2013-12-19 10 views
12

die unterhalb der Linie verwenden,Wie überschreibt man einen Ordner mit [NSfilemanager defaultmanager] beim Kopieren?

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

Wir können einen Ordner kopieren, aber wenn der Ordner bereits vorhanden wirft es eine Ausnahme „Datei vorhanden“. Um eine einzelne Datei zu überschreiben, können wir sie durch die folgenden Zeilen erreichen:

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

Aber ich will einen bereits vorhandenen Ordner d.h kopieren, Überschreiben.

Bearbeiten: Einfache Möglichkeit, kann ich die Elemente vor dem Kopieren sie entfernen.

Bitte schlagen Sie weitere Möglichkeiten vor.

+2

Bitte überprüfen Sie dies: - http://StackOverflow.com/Questions/6137423/How-to-Overwrite-a-file-with-nsfilemanager-when-copying –

Antwort

10

Das Standardverhalten von NSFileManager Methode ist eine Ausnahme/Fehler werfen „Datei vorhanden ist.“ wenn die Datei existiert. Aber nach wie vor, wenn Sie mit NSFileManager überschrieben werden soll, dann bietet es eine api für das, was unter replaceItemAtURL als auch in der ersten Lösung erwähnt wird: -

Auch gibt es drei Lösungen zu erreichen, dass

erste Lösung

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

Mit der obigen API können Sie den Inhalt der Datei überschreiben. Vorher müssen Sie jedoch die Sicherung Ihres Quellpfads in Ihrem temporären Verzeichnis vornehmen.

Zweite Lösung

Schon haben Sie in Ihrer Frage erwähnt NSData writeToUrl verwenden.

dritte Lösung

trojanfoe hat in their answer. erwähnt das heißt entfernen das Element vorher überschrieben werden.

+0

Entschuldigung für die Annahme mit (großer) Verzögerung. kam nach langer Pause zurück. Vielleicht wird diese Prämie kompensieren :) – itechnician

3

den Artikel entfernen erste, mit:

[fileManager removeItemAtPath:targetPath error:NULL]; 

(das heißt ignoriert alle Fehler)

+0

Vielen Dank für Ihre Antwort. Zum Kopieren meines Ordners dauert es ungefähr 10 Sekunden im Gerät. Dann, hier in meinem Fall, Wenn ich das gleiche lösche, dann wird die Operationszeit verdoppelt. – itechnician

+0

-1: Warum ignorieren Sie den Fehler? Was ist, wenn Sie keine Berechtigung zum Entfernen des Elements haben?Zumindest sollte es in der Konsole protokolliert werden. –

+0

@CraigOtis Es wird von der nächsten Codezeile (vom OP bereitgestellt) abgefangen. – trojanfoe

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

Bitte erklären Sie etwas, was es tut? – doptimusprime

+0

Überprüfen Sie zuerst, ob die Datei existiert oder nicht. Wenn ja, dann entfernen Sie die Datei. Das ignoriert den Fehler --- benutze nach [fileManager copyItemAtPath: sourcePath toPath: targetPath error: & error]; –

5

Ich möchte ein weiteres mit Delegaten hinzuzufügen, um Dateien mit copyItemAtPath (NSFileManager) -Funktion außer Kraft zu setzen:

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

und implementieren die Delegierten optionale Funktion:

- (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; 
} 
Verwandte Themen