Il existe trois types de chemins inscriptibles : le premier est celui des documents, dans lequel vous stockez les éléments que vous souhaitez conserver et mettre à la disposition de l'utilisateur via iTunes (à partir de la version 3.2) :
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
Deuxièmement, et de manière très similaire au répertoire Documents, il y a le dossier Library, dans lequel vous stockez les fichiers de configuration et les bases de données accessibles en écriture que vous souhaitez également conserver, mais que vous ne voulez pas que l'utilisateur puisse manipuler via iTunes :
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryDirectory = [paths objectAtIndex:0];
Notez que même si l'utilisateur ne peut pas voir les fichiers dans iTunes en utilisant un appareil antérieur à la version 3.2 (l'iPad), la constante NSLibraryDirectory est disponible depuis l'iPhoneOS 2.0, et peut donc être utilisée pour les versions visant la version 3.0 (ou même plus anciennes si vous continuez à le faire). Par ailleurs, l'utilisateur ne pourra rien voir à moins que vous ne signaliez une application comme autorisant les utilisateurs à modifier des documents, donc si vous utilisez Documents aujourd'hui, tout va bien tant que vous changez d'emplacement lors de la mise à jour pour la prise en charge des documents de l'utilisateur.
Enfin, il existe un répertoire de cache, dans lequel vous pouvez placer des images dont vous ne vous souciez pas qu'elles existent à long terme ou non (le téléphone peut les supprimer à un moment donné) :
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [paths objectAtIndex:0];
BOOL isDir = NO;
NSError *error;
if (! [[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) {
[[NSFileManager defaultManager] createDirectoryAtPath:cachePath withIntermediateDirectories:NO attributes:nil error:&error];
}
Notez que vous devez créer le répertoire Caches à cet endroit, donc lorsque vous écrivez, vous devez vérifier et créer à chaque fois ! C'est un peu pénible, mais c'est comme ça.
Ensuite, lorsque vous avez un chemin accessible en écriture, il vous suffit d'y ajouter un nom de fichier, comme suit :
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"SomeDirectory/SomeFile.txt"];
o
NSString *filePath = [cachePath stringByAppendingPathComponent:@"SomeTmpFile.png"];
Utilisez ce chemin pour lire ou écrire.
Notez que vous pouvez créer des sous-répertoires dans l'un ou l'autre de ces chemins accessibles en écriture, que l'une des chaînes de l'exemple ci-dessus utilise (en supposant que l'une d'entre elles ait été créée).
Si vous essayez d'écrire une image dans la photothèque, vous ne pouvez pas utiliser les appels au système de fichiers pour le faire - au lieu de cela, vous devez avoir une UIImage en mémoire, et utiliser la fonction UIImageWriteToSavedPhotosAlbum()
défini par UIKit. Vous n'avez aucun contrôle sur le format de destination ou les niveaux de compression, et vous ne pouvez pas joindre d'EXIF de cette manière.