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?

Odpowiedzi:


213

Tak. To będzie.

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.