Czy writeToFile: atomowo: nadpisze dane?

93

Naprawdę proste pytanie, ale nie wydaje się być jasne w dokumentach Apple.

Czy writeToFile:atomically:dla NSData, NSArrayitp Zastąp istniejące dane dotyczące pliku?

Jiho Kang
źródło

Odpowiedzi:

213

Tak. To będzie.

Oto kilka znaków, które mogą przekroczyć limit 30 znaków.

BJ Homer
źródło
20
Nie ma znaczenia, czy zrobisz to atomowo, czy nie; w obu przypadkach plik zostanie całkowicie nadpisany nowymi danymi.
BJ Homer
Ach, ale dla mnie to się nie udaje, a oryginalny plik jest nienaruszony. Ponieważ writeToFile nie zwraca błędu NSError, jak mogę zbadać błąd? może to być problem z uprawnieniami, ale nie mam pewności. Mój kod działa jako pakiet wtyczek instalatora, dla pakietu instalacyjnego wymagającego uprawnień administratora - nie wiem, jak zweryfikować / wydrukować uprawnienia, z którymi mój kod jest uruchamiany.
Motti Shneor
1
@MottiShneor Zamiast tego można użyć -writeToURL: options: error:, który ma parametr błędu.
BJ Homer
7

Metoda writeToFile:atomically: ZAWSZE NADPISYWAJ PLIK , niezależnie od atomically:TAK lub NIE.

Informacje z dokumentów Apple (NSData, sekcja „Zapisywanie danych”):

Klasa NSData i jej podklasy zapewniają metody szybkiego i łatwego zapisywania ich zawartości na dysku. Aby zminimalizować ryzyko utraty danych, metody te zapewniają opcję niepodzielnego zapisywania danych. Zapisy Atomic gwarantują, że dane zostaną zapisane w całości lub całkowicie zawiedzie. Zapis atomowy rozpoczyna się od zapisania danych do pliku tymczasowego. Jeśli ten zapis powiedzie się, metoda przenosi plik tymczasowy do jego ostatecznej lokalizacji.

Ani słowa o sprawdzaniu, czy plik istnieje.

Na przykład dla metody copyItemAtPath:toPath:error:w dokumentacji (NSFileManager, sekcja Dyskusja) specjalnie napisanej o takim sprawdzaniu:

Jeśli plik o tej samej nazwie już istnieje w dstPath, ta metoda zatrzymuje próbę kopiowania i zwraca odpowiedni błąd.

Igor
źródło