WriteToFile: atomiquement: écrasera-t-il les données?

92

Question vraiment simple mais cela ne semble pas clair dans la documentation d'Apple.

Est-ce que writeToFile:atomically:for NSData, NSArrayetc. écrasera les données existantes sur un fichier?

Jiho Kang
la source

Réponses:

212

Oui. Ce sera.

Voici quelques caractères pour passer la limite de 30 caractères.

BJ Homer
la source
20
Que vous le fassiez de manière atomique ou non n'a pas d'importance; dans les deux cas, le fichier sera complètement écrasé par les nouvelles données.
BJ Homer
Ah, mais pour moi, cela échoue, et le fichier d'origine est intact. Comme writeToFile ne renvoie pas une NSError, comment puis-je enquêter sur l'échec? il peut s'agir d'un problème d'autorisations, mais je ne peux pas en être sûr. Mon code fonctionne comme un ensemble de plugins d'installation, pour un package d'installation qui exige des privilèges root - je ne sais pas comment vérifier / imprimer les privilèges avec lesquels mon code est exécuté.
Motti Shneor
1
@MottiShneor Vous pouvez utiliser -writeToURL: options: error: à la place, qui a un paramètre d'erreur.
BJ Homer
7

Méthode writeToFile:atomically: TOUJOURS OVERWRITE FILE , quel que soit le atomically:OUI ou le NON.

Informations provenant de la documentation Apple (NSData, section «Enregistrement des données»):

La classe NSData et ses sous-classes fournissent des méthodes pour enregistrer rapidement et facilement leur contenu sur le disque. Pour minimiser le risque de perte de données, ces méthodes offrent la possibilité de sauvegarder les données de manière atomique. Les écritures Atomic garantissent que les données sont soit enregistrées dans leur intégralité, soit qu'elles échouent complètement. L'écriture atomique commence par écrire les données dans un fichier temporaire. Si cette écriture réussit, la méthode déplace le fichier temporaire vers son emplacement final.

Pas un mot sur la vérification de l'existence du fichier.

Par exemple, pour la méthode copyItemAtPath:toPath:error:dans la documentation (NSFileManager, section Discussion) spécifiquement écrite sur une telle vérification:

Si un fichier du même nom existe déjà dans dstPath, cette méthode arrête la tentative de copie et renvoie une erreur appropriée.

Igor
la source