Comment faire pour remplacer un fichier avec NSFileManager lors de la copie?
Je suis en utilisant cette méthode pour copier un fichier:
[fileManager copyItemAtPath:sourcePath toPath:targetPath error:&error];
Je veux remplacer un fichier s'il existe déjà. Le comportement par défaut de cette méthode est de lancer une exception/erreur "le Fichier Existe déjà". lorsque le fichier existe. Il n'y a pas d'option pour spécifier qu'il doit remplacer.
Alors quelle serait la meilleure façon de faire?
Aurais-je vérifier d'abord si le fichier existe, supprimez-le, puis essayez de le copier? Cela a le danger que l'application ou le périphérique s'en va à droite dans l'ordre de la nanoseconde après que le fichier a été supprimé, mais le nouveau fichier n'a pas été copié à cet endroit. Ensuite, il n'y a rien.
Peut-être que je devrais changer le nom du nouveau fichier d'abord, puis de supprimer l'ancien, et puis re-modifier le nom de la nouvelle? Même problème. Que si, dans cet ordre de la nanoseconde l'application ou l'appareil s'ÉTEINT et le renommage n'arrive pas?
Vous devez vous connecter pour publier un commentaire.
Vous aimeriez faire un atomique enregistrer dans ce cas, qui serait mieux atteint en utilisant
NSData
ouNSString
'swriteToFile:atomically:
méthodes (et leurs variantes):Ou pour un
NSString
:NSFileManager
's-moveItemAtPath:toPath:error:
méthode.Si vous ne pouvez pas/ne voulez pas conserver le contenu du fichier en mémoire, mais veulent atomique de réécriture, comme indiqué dans les autres suggestions, vous pouvez d'abord copier le fichier original dans un répertoire temporaire à un chemin d'accès unique (la documentation d'Apple suggère d'utiliser un répertoire temporaire), puis utilisez NSFileManager de
-replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:
Selon la documentation de référence, cette méthode remplace le contenu de l'article dans l'URL spécifiée d'une manière qui assure la perte de données se produit.' (à partir de la documentation de référence). La copie de l'original dans le répertoire temporaire est nécessaire, car cette méthode déplace le fichier d'origine.
Voici la NSFileManager documentation de référence sur
-replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:erreur:
Détecter le fichier existe d'erreur, supprimez le fichier de destination et copie de nouveau.
Exemple de code Swift 2.0:
Si vous n'êtes pas sûr si le fichier existe, cela fonctionne sur swift 3+
La première ligne échoue et est ignoré si le fichier n'existe pas déjà. Si il y a une exception pendant la deuxième ligne, il jette comme il se doit.
Pour écraser des fichiers, je préfère
Retrait & de la copie de fichiers en boucle parfois ne fonctionne pas comme prévu
Swift4:
Je pense que la possibilité de l'ordre de la nanoseconde vous mensioned est faible. suivez donc la première méthode pour supprimer le fichier existant et de copier le nouveau fichier.
Je pense que ce que vous cherchez est la NSFileManagerDelegate protocole de la méthode:
À partir de cette méthode, vous pouvez décider quoi faire avec le fichier existant (renommer/supprimer), puis procéder à la copie.
C'est pour l'amélioration de "l'Swift 3 et au-dessus" de la question " Déplacez le fichier et remplacer [dupliquer] " qui est marquée du double de cette question.
Pour déplacer le fichier à partir de sourcepath(string) pour DestinationPath(chaîne de caractères).
Supprimer le fichier existant si le même nom de fichier existe déjà à DestinationPath.