131 votes

Quel est le répertoire des documents (NSDocumentDirectory) ?

Quelqu'un peut-il m'expliquer ce qu'est le répertoire des documents dans une application iOS et quand l'utiliser ?

Voici ce que je crois pour le moment :

Pour moi, il semble s'agir d'un dossier central où l'utilisateur peut stocker tous les fichiers nécessaires à l'application.

Cela serait un emplacement différent de celui où Core Data stocke ses données ?

Il semble que chaque application possède son propre répertoire des documents.

Je suis libre de créer un sous-répertoire du répertoire des documents, comme répertoire des documents/images, ou répertoire des documents/vidéos ?

0 votes

Si je me souviens bien, le NSDocumentDirectory se trouve dans le même chemin que les données de base de l'application, et chaque application a son propre répertoire de documents. Et oui, vous pouvez librement mettre toutes les ressources dont vous avez besoin pour votre application ici. Au fait, il semble que votre question ne soit pas encore terminée?

0 votes

Je viens de poster quelque chose que je pense être lié à votre question ici stackoverflow.com/questions/5105250/… vérifiez si cela fonctionne pour vous.

0 votes

Pour toute personne provenant de Google, notez que cela a changé dans iOS 8. Voir ma réponse ci-dessous.

200voto

WrightsCS Points 32170

Votre application (sur un appareil non jailbreaké) ne fonctionne que dans un environnement "sandbox". Cela signifie qu'elle ne peut accéder qu'aux fichiers et répertoires de son propre contenu. Par exemple Documents et Library.

Consultez le Guide de programmation des applications iOS.

Pour accéder au répertoire Documents de votre application sandbox, vous pouvez utiliser le suivant :

iOS 8 et plus récent, c'est la méthode recommandée

+ (NSURL *)applicationDocumentsDirectory
{
     return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

si vous devez prendre en charge iOS 7 ou antérieur

+ (NSString *) applicationDocumentsDirectory 
{    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = paths.firstObject;
    return basePath;
}

Ce répertoire Documents vous permet de stocker des fichiers et sous-répertoires que votre application crée ou pourrait avoir besoin.

Pour accéder aux fichiers dans le répertoire Library de la sandbox de vos applications, utilisez (à la place de paths ci-dessus) :

[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]

13 votes

J'ai découvert que [@"~/Documents" stringByExpandingTildeInPath] fait la même chose. Y a-t-il une raison pour laquelle cela devrait être découragé?

36 votes

Je n'utiliserais pas l'approche avec @"~/Documents". Durcir les chemins n'est jamais une bonne idée. Cela peut fonctionner maintenant, mais si Apple choisit un jour de renommer ou de déplacer le répertoire Documents, votre application sera cassée. NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); vous donnera toujours le répertoire correct!

16 votes

Vous devriez toujours utiliser l'API fournie. C'est pour ça qu'elle est là! Vous avez eu de la chance jusqu'à présent.

44voto

livingtech Points 1740

Cela a changé dans iOS 8. Voir la note technique suivante : https://developer.apple.com/library/ios/technotes/tn2406/_index.html

La méthode approuvée par Apple (à partir du lien ci-dessus) est la suivante :

// Retourne l'URL vers le répertoire Documents de l'application.
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

22voto

Hari Karam Singh Points 1942

Je n'ai pas pu trouver le code dans la documentation suggérée par la réponse acceptée mais j'ai trouvé l'équivalent mis à jour ici :

Guide de programmation du système de fichiers :: Accès aux fichiers et répertoires »

- (NSURL*)applicationDataDirectory {
    NSFileManager* sharedFM = [NSFileManager defaultManager];
    NSArray* possibleURLs = [sharedFM URLsForDirectory:NSApplicationSupportDirectory
                                 inDomains:NSUserDomainMask];
    NSURL* appSupportDir = nil;
    NSURL* appDirectory = nil;

    if ([possibleURLs count] >= 1) {
        // Utiliser le premier répertoire (si plusieurs sont renvoyés)
        appSupportDir = [possibleURLs objectAtIndex:0];
    }

    // Si un répertoire d'assistance à l'application valide existe, ajoutez l'identifiant de bundle de l'application pour spécifier le répertoire final.
    if (appSupportDir) {
        NSString* appBundleID = [[NSBundle mainBundle] bundleIdentifier];
        appDirectory = [appSupportDir URLByAppendingPathComponent:appBundleID];
    }

    return appDirectory;
}

Cela décourage l'utilisation de NSSearchPathForDirectoriesInDomain:

La fonction NSSearchPathForDirectoriesInDomains se comporte comme la méthode URLsForDirectory:inDomains: mais renvoie l'emplacement du répertoire sous forme de chemin basé sur des chaînes. Vous devriez utiliser la méthode URLsForDirectory:inDomains: à la place.

Voici quelques autres constantes de répertoire utiles à expérimenter. Sans aucun doute, tous ces répertoires ne sont pas pris en charge dans iOS. Vous pouvez également utiliser la fonction NSHomeDirectory() qui :

Dans iOS, le répertoire principal est le répertoire sandbox de l'application. Sous OS X, il s'agit du répertoire sandbox de l'application ou du répertoire principal de l'utilisateur actuel (si l'application n'est pas dans une sandbox).

Depuis NSPathUtilities.h

NSApplicationDirectory = 1,             // applications prises en charge (Applications)
    NSDemoApplicationDirectory,             // applications non prises en charge, versions de démonstration (Démos)
    NSDeveloperApplicationDirectory,        // applications pour développeurs (Developer/Applications). OBSOLETE - il n'y a pas un seul répertoire pour les développeurs.
    NSAdminApplicationDirectory,            // applications pour l'administration système et réseau (Administration)
    NSLibraryDirectory,                     // divers fichiers de documentation, de support et de configuration, ressources (Library)
    NSDeveloperDirectory,                   // ressources pour les développeurs (Developer) OBSOLETE - il n'y a pas un seul répertoire pour les développeurs.
    NSUserDirectory,                        // répertoires principaux des utilisateurs (Utilisateurs)
    NSDocumentationDirectory,               // documentation (Documentation)
    NSDocumentDirectory,                    // documents (Documents)
    NSCoreServiceDirectory,                 // emplacement du dossier CoreServices (System/Library/CoreServices)
    NSAutosavedInformationDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 11,   // emplacement des documents sauvegardés automatiquement (Documents/Autosaved)
    NSDesktopDirectory = 12,                // emplacement du bureau de l'utilisateur
    NSCachesDirectory = 13,                 // emplacement des fichiers cache jetables (Library/Caches)
    NSApplicationSupportDirectory = 14,     // emplacement des fichiers de support de l'application (plug-ins, etc) (Library/Application Support)
    NSDownloadsDirectory NS_ENUM_AVAILABLE(10_5, 2_0) = 15,              // emplacement du répertoire "Téléchargements" de l'utilisateur
    NSInputMethodsDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 16,           // méthodes de saisie (Library/Input Methods)
    NSMoviesDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 17,                 // emplacement du répertoire des films de l'utilisateur (~/Films)
    NSMusicDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 18,                  // emplacement du répertoire de musique de l'utilisateur (~/Musique)
    NSPicturesDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 19,               // emplacement du répertoire des images de l'utilisateur (~/Images)
    NSPrinterDescriptionDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 20,     // emplacement du dossier PPDs du système (Library/Printers/PPDs)
    NSSharedPublicDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 21,           // emplacement du répertoire de partage public de l'utilisateur (~/Public)
    NSPreferencePanesDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 22,        // emplacement du dossier Préférences pour une utilisation avec Préférences Système (Library/PreferencePanes)
    NSApplicationScriptsDirectory NS_ENUM_AVAILABLE(10_8, NA) = 23,      // emplacement du dossier scripts utilisateur pour l'application appelante (~/Library/Application Scripts/code-signing-id)
    NSItemReplacementDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 99,       // Pour une utilisation avec URLForDirectory:inDomain:appropriateForURL:create:error: de NSFileManager
    NSAllApplicationsDirectory = 100,       // tous les répertoires où des applications peuvent se trouver
    NSAllLibrariesDirectory = 101,          // tous les répertoires où des ressources peuvent se trouver
    NSTrashDirectory NS_ENUM_AVAILABLE(10_8, NA) = 102                   // emplacement du dossier Corbeille

Et enfin, quelques méthodes pratiques dans une catégorie NSURL http://club15cc.com/code/ios/easy-ios-file-directory-paths-with-this-handy-nsurl-category

8voto

Swift 3 et 4 en tant que var globale :

var documentsDirectory: URL {
    return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!
}

En tant qu'extension FileManager :

extension FileManager {
    static var documentsDirectory: URL {
        return `default`.urls(for: .documentDirectory, in: .userDomainMask).last!
    }

    var documentsDirectory: URL {
        return urls(for: .documentDirectory, in: .userDomainMask).last!
    }
}

6voto

Paul Robinson Points 3226

Il peut être plus propre d'ajouter une extension à FileManager pour ce genre d'appel maladroit, pour le rangement si rien d'autre. Quelque chose comme :

extension FileManager {
    static var documentDir : URL {
        return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X