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.

6voto

Eric Points 1892

En plus du dossier Documents, iOS vous permet également de sauvegarder des fichiers dans les dossiers temp et Library.

Pour plus d'informations sur lequel utiliser, consultez ce lien de la documentation:

4voto

Sumit Oberoi Points 11

Vous pouvez accéder au répertoire des documents en utilisant ce code, il est généralement utilisé pour stocker des fichiers au format plist :

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths firstObject];
return documentsDirectory;

0 votes

Cette même réponse a été donnée il y a 3 ans par WrightsCS. De plus, donner cette réponse en 2014 est étrange, étant donné qu'Apple recommande la méthode dans la réponse de livingtech.

0 votes

Si vous pensez que j'ai tort de voter négativement, expliquez pourquoi. Un vote négatif de représailles sur l'une de mes questions est puéril. Ce site vise à mettre en avant les meilleures réponses.

0 votes

@jeff merci d'avoir signalé, j'ai fait des recherches et tu avais raison. nouvelle solution : - (NSURL *)applicationDocumentsDirectory { return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; }

1voto

Mike Gledhill Points 2105

Voici une petite fonction utile qui rend l'utilisation/création de dossiers iOS un peu plus facile.

Vous lui passez le nom d'un sous-dossier, il vous renverra le chemin complet et s'assurera que le répertoire existe.

(Personnellement, je place cette fonction statique dans ma classe AppDelete, mais peut-être n'est-ce pas l'endroit le plus judicieux pour la mettre.)

Voici comment vous l'appelleriez pour obtenir le "chemin complet" d'un sous-répertoire MySavedImages :

NSString* fullPath = [AppDelegate getFullPath:@"MySavedImages"];

Et voici la fonction complète :

+(NSString*)getFullPath:(NSString*)folderName
{
    // Vérifie si un sous-répertoire existe dans notre répertoire Documents sandboxé.
    // Renvoie le chemin complet du répertoire.
    //
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    if (paths.count < 1)
        return nil;

    NSString *rootFolder = [paths firstObject];
    NSString* fullFolderPath = [rootFolder stringByAppendingPathComponent:folderName];

    BOOL isDirectory;
    NSFileManager* manager = [NSFileManager defaultManager];

    if (![manager fileExistsAtPath:fullFolderPath isDirectory:&isDirectory] || !isDirectory) {
        NSError *error = nil;
        NSDictionary *attr = [NSDictionary dictionaryWithObject:NSFileProtectionComplete
                                                         forKey:NSFileProtectionKey];
        [manager createDirectoryAtPath:fullFolderPath
           withIntermediateDirectories:YES
                            attributes:attr
                                 error:&error];
        if (error) {
            NSLog(@"Erreur lors de la création du chemin du répertoire : %@", [error localizedDescription]);
            return nil;
        }
    }
    return fullFolderPath;
}

En utilisant cette petite fonction, il est facile de créer un répertoire dans le répertoire Documents de votre application (s'il n'existe pas déjà) et d'y écrire un fichier.

Voici comment je créerais le répertoire et écrirais le contenu d'un de mes fichiers image :

// Créons un sous-répertoire "MySavedImages" (s'il n'existe pas déjà)
NSString* fullPath = [AppDelegate getFullPath:@"MySavedImages"];

// Par exemple, chargeons les données d'un de mes fichiers image
NSString* imageFilename = @"icnCross.png";

UIImage* image = [UIImage imageNamed:imageFilename];
NSData *imageData = UIImagePNGRepresentation(image);

// Obtenons le chemin complet + nom de fichier où nous pouvons écrire ce .png, dans notre nouveau répertoire MySavedImages
NSString* imageFilePathname = [fullPath stringByAppendingPathComponent:imageFilename];

// Écrivons les données
[imageData writeToFile:imageFilePathname atomically:YES];

J'espère que cela vous aidera !

0voto

akashlal.com Points 75

Comme d'autres l'ont mentionné, votre application s'exécute dans un environnement sandbox et vous pouvez utiliser le répertoire des documents pour stocker des images ou d'autres ressources que votre application peut utiliser, par exemple en téléchargeant des fichiers hors ligne selon les préférences de l'utilisateur - Bases du système de fichiers - Documentation Apple - Quel répertoire utiliser pour stocker des fichiers spécifiques à l'application

Mis à jour pour Swift 5, vous pouvez utiliser l'une de ces fonctions, selon les besoins -

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return paths[0]
}

func getCacheDirectory() -> URL {
        let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
        return paths[0]
    }

func getApplicationSupportDirectory() -> URL {
        let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
        return paths[0]
    }

Utilisation :

let urlPath = "https://jumpcloud.com/wp-content/uploads/2017/06/SSH-Keys.png" //Ou un chemin de chaîne vers une URL d'image valide, par exemple.

if let url = URL(string: urlPath){
    let destination = getDocumentsDirectory().appendingPathComponent(url.lastPathComponent)
    do {
        let data = try Data(contentsOf: url) //Appel synchrone, juste à titre d'exemple
        try data.write(to: destination)
    } catch _ {
        //Faites quelque chose pour gérer l'erreur
    }
}

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