web-dev-qa-db-fra.com

Obtenir un chemin par programme vers le dossier Application Support

J'essaie d'obtenir un NSString pour le dossier de support d'application de l'utilisateur.

Je sais que je peux faire NSString *path = @"~/Library/Application Support"; mais cela ne semble pas très élégant. J'ai joué avec l'utilisation de NSSearchPathForDirectoriesInDomains, mais elle semble être assez longue et crée plusieurs objets inutiles (du moins, mon implémentation le fait).

Y a-t-il un moyen simple de faire cela?

52
Jack James

Ceci est obsolète, utilisez FileManager.default.urls(for:in:) pour les meilleures pratiques actuelles, comme dans le commentaire de @ andyvn22 ci-dessous.

la meilleure pratique consiste à utiliser NSSearchPathForDirectoriesInDomains avec NSApplicationSupportDirectory aussi long que possible.

Exemple:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *applicationSupportDirectory = [paths firstObject];
NSLog(@"applicationSupportDirectory: '%@'", applicationSupportDirectory);

Sortie NSLog:

applicationSupportDirectory: '/Volumes/User/me/Library/Application Support'
67
zaph

Swift 4:

print(NSHomeDirectory())

ou

print(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)

et

let yourString = String(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)
30
Juan Boero

Swift 3:

FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
18
Andreas Ley

Cela fonctionne pour moi:

NSError *error;
NSURL* appSupportDir = [[NSFileManager defaultManager]     
         URLForDirectory:NSApplicationSupportDirectory
                inDomain:NSUserDomainMask
       appropriateForURL:nil
                  create:YES
                   error:&error];
2
Jeff Pearce

Créez une classe Objective C séparée pour la lecture et l’écriture dans le répertoire de documents. Je vais éviter la réécriture du code. Ci-dessous est ma version de celui-ci.

//Directory.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#define PATH (NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES))
#define BASEPATH (([PATH count] > 0)? [PATH objectAtIndex:0] : nil)

@interface DocumentsDirectory : NSObject

//Here you can also use URL path as return type and file path.
+(void)removeFilesfromDocumentsDirectory:(NSString*)filename;
+(NSString*)writeFiletoDocumentsDirectory:(NSString*)filename;
@end


#import "Directory.h"

@implementation DocumentsDirectory

UIAlertView *updateAlert;

+(void)removeFilesfromDocumentsDirectory:(NSString*)filename
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *filePath = [BASEPATH stringByAppendingPathComponent:filename];

    NSError *error;
    BOOL success = [fileManager removeItemAtPath:filePath error:&error]; //Remove or delete file from documents directory.

    if (success)
    {
        updateAlert= [[UIAlertView alloc] initWithTitle:@"Congratulations:" message:@"File is updated successfully" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [updateAlert show];
    }
    else
    {
        NSLog(@"Could not delete file -:%@ ",[error localizedDescription]);
        updateAlert= [[UIAlertView alloc] initWithTitle:@"Try again:" message:[error localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [updateAlert show];
    }
}

+(NSString*)writeFiletoDocumentsDirectory:(NSString*)filename
{
    NSString *foldDestination = BASEPATH;
    NSString *filePath = [foldDestination stringByAppendingPathComponent:filename];

    return filePath;
}

@end
0
WasimSafdar

C'est ce que j'utilise pour obtenir la base de données. Je l'ai eu de la classe de Stanford. Cela pourrait aider quelqu'un.

NSURL *url = [[[NSFileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"database_name"];
NSLog(@"Database URL: %@",url);
0
Flaviu