Wird writeToFile: atomar: Daten überschreiben?

92

Wirklich einfache Frage, aber sie scheint in Apples Dokumenten nicht klar zu sein.

Wird writeToFile:atomically:für NSData, NSArrayusw. Überschreiben vorhandener Daten auf einer Datei?

Jiho Kang
quelle

Antworten:

212

Ja. Es wird.

Hier sind einige Zeichen, um das 30-Zeichen-Limit zu überschreiten.

BJ Homer
quelle
20
Ob Sie es atomar tun oder nicht, spielt keine Rolle; In beiden Fällen wird die Datei mit den neuen Daten vollständig überschrieben.
BJ Homer
Ah, aber für mich schlägt es fehl und die Originaldatei ist intakt. Wie kann ich den Fehler untersuchen, da writeToFile keinen NSError zurückgibt? Es kann ein Berechtigungsproblem sein, aber ich kann nicht sicher sein. Mein Code wird als Installer Plugin Bundle für ein Installationspaket ausgeführt, für das Root-Berechtigungen erforderlich sind. Ich kann die Berechtigungen, mit denen mein Code ausgeführt wird, nicht überprüfen / ausdrucken.
Motti Shneor
1
@MottiShneor Sie können stattdessen -writeToURL: options: error: verwenden, das einen Fehlerparameter enthält.
BJ Homer
6

Methode writeToFile:atomically: ÜBERSCHREIBEN SIE DIE DATEI IMMER , unabhängig von atomically:JA oder NEIN.

Informationen aus Apple-Dokumenten (NSData, Abschnitt "Speichern von Daten"):

Die NSData-Klasse und ihre Unterklassen bieten Methoden zum schnellen und einfachen Speichern ihres Inhalts auf der Festplatte. Um das Risiko eines Datenverlusts zu minimieren, bieten diese Methoden die Möglichkeit, die Daten atomar zu speichern. Atomic-Schreibvorgänge garantieren, dass die Daten entweder vollständig gespeichert werden oder vollständig fehlschlagen. Das atomare Schreiben beginnt mit dem Schreiben der Daten in eine temporäre Datei. Wenn dieser Schreibvorgang erfolgreich ist, verschiebt die Methode die temporäre Datei an ihren endgültigen Speicherort.

Kein Wort über die Überprüfung, ob eine Datei vorhanden ist.

Zum Beispiel für Methoden copyItemAtPath:toPath:error:in Dokumenten (NSFileManager, Abschnitt Diskussion), die speziell über solche Überprüfungen geschrieben wurden:

Wenn bei dstPath bereits eine gleichnamige Datei vorhanden ist, stoppt diese Methode den Kopierversuch und gibt einen entsprechenden Fehler zurück.

Igor
quelle