iphone - titel - title tag wordpress




Wie überschreibe ich eine Datei beim Kopieren mit NSFileManager? (6)

Datei erkennen existiert Fehler, lösche die Zieldatei und kopiere erneut.

Beispielcode in Swift 2.0:

class MainWindowController: NSFileManagerDelegate {

    let fileManager = NSFileManager()

    override func windowDidLoad() {
        super.windowDidLoad()
        fileManager.delegate = self
        do {
            try fileManager.copyItemAtPath(srcPath, toPath: dstPath)
        } catch {
            print("File already exists at \'\(srcPath)\':\n\((error as NSError).description)")
        }
    }

    func fileManager(fileManager: NSFileManager, shouldProceedAfterError error: NSError, copyingItemAtPath srcPath: String, toPath dstPath: String) -> Bool {
        if error.code == NSFileWriteFileExistsError {
            do {
                try fileManager.removeItemAtPath(dstPath)
                print("Existing file deleted.")
            } catch {
                print("Failed to delete existing file:\n\((error as NSError).description)")
            }
            do {
                try fileManager.copyItemAtPath(srcPath, toPath: dstPath)
                print("File saved.")
            } catch {
                print("File not saved:\n\((error as NSError).description)")
            }
            return true
        } else {
            return false
        }
    }
}

Ich verwende diese Methode, um eine Datei zu kopieren:

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

Ich möchte eine Datei überschreiben, wenn sie bereits existiert. Das Standardverhalten dieser Methode ist das Auslösen einer Ausnahme / eines Fehlers "Datei vorhanden". wenn die Datei existiert. Es gibt keine Option, um anzugeben, dass es überschrieben werden soll.

Was wäre der sicherste Weg, dies zu tun?

Würde ich zuerst prüfen, ob die Datei existiert, sie dann löschen und dann versuchen zu kopieren? Dies hat die Gefahr, dass die App oder das Gerät innerhalb von wenigen Sekunden nach dem Löschen der Datei ausgeschaltet wird, die neue Datei jedoch nicht an diesen Ort kopiert wurde. Dann gibt es nichts.

Vielleicht müsste ich zuerst den Namen der neuen Datei ändern, dann die alte löschen und dann den Namen der neuen Datei ändern? Gleiches Problem. Was passiert, wenn in dieser Nanosekunde die App oder das Gerät ausgeschaltet wird und eine Umbenennung nicht stattfindet?


Dies dient der Verbesserung von "Swift 3 und höher" in der Frage " Datei verschieben und überschreiben [Duplizieren] ", die als Duplikat dieser Frage gekennzeichnet ist.

So verschieben Sie die Datei vom Quellpfad (Zeichenfolge) in den Zielpfad (Zeichenfolge). Löschen Sie die vorhandene Datei, wenn die Datei mit demselben Namen bereits bei DestinationPath existiert.

// Set the correct path in string in 'let' variables.
let destinationStringPath = ""
let sourceStringPath = ""

let fileManager:FileManager = FileManager.default
do
{
    try fileManager.removeItem(atPath: sourceStringPath)
}
catch
{
}

do
{
    try fileManager.moveItem(atPath: sourceStringPath, toPath: destinationStringPath)
}
catch
{
}

Ich denke, was Sie suchen, ist die NSFileManagerDelegate-Protokollmethode:

- (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error copyingItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath;

Von dieser Methode aus können Sie entscheiden, was mit der vorhandenen Datei geschehen soll (umbenennen / löschen) und dann mit der Kopie fortfahren.


Ich weiß, es ist ein kleines Schwergewicht, aber es funktioniert für mich:

task = Process()
task.launchPath = "/bin/cp"
task.arguments = [srcPath, dstPath]
task.launch()
task.waitUntilExit()

Manchmal ist Leistung kein Problem und wir brauchen nur etwas Einfaches und funktionieren einfach.


Swift4:

_ = try FileManager.default.replaceItemAt(previousItemUrl, withItemAt: currentItemUrl)

Wenn Sie den Inhalt der Datei nicht im Speicher behalten können / wollen, sondern wie in den anderen Vorschlägen beschrieben eine atomare Neuschreibung wünschen, können Sie zuerst die Originaldatei in ein temporäres Verzeichnis in einen eindeutigen Pfad kopieren (Apples Dokumentation schlägt vor, a temporäres Verzeichnis) und verwenden Sie dann NSFileManager

-replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:

Laut der Referenzdokumentation ersetzt diese Methode den Inhalt des Elements bei der angegebenen URL so, dass kein Datenverlust auftritt. (aus der Referenzdokumentation). Das Kopieren des Originals in das temporäre Verzeichnis ist erforderlich, da diese Methode die Originaldatei verschiebt. Hier ist die NSFileManager-Referenzdokumentation zu -replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:







nsfilemanager