2011-12-08 23 views
43

Sto cercando di ottenere una NSString per la cartella del supporto dell'applicazione dell'utente.Percorso di accesso alla cartella Supporto applicazioni

So che posso fare NSString *path = @"~/Library/Application Support"; ma questo non sembra molto elegante. Ho giocato con l'uso di NSSearchPathForDirectoriesInDomains ma sembra essere piuttosto prolisso e crea diversi oggetti non necessari (almeno, la mia implementazione lo fa).

C'è un modo semplice per farlo?

+0

in realtà è '~/Library/Application Support /' ... – Eimantas

+0

perché è questo tagged iphone, ipad, e iOS? –

+0

@Eimantas: Sì, OP corretto. –

risposta

63

Si consiglia di utilizzare NSSearchPathForDirectoriesInDomains con NSApplicationSupportDirectory come "molto ventoso" come potrebbe essere.

Esempio:

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

uscita NSLog:

applicationSupportDirectory: '/Volumes/User/me/Library/Application Support' 
+0

Sembra molto più pulito di quello che avevo. Grazie. –

+1

Per il rapido non è il metodo preferito. Da docs: 'Dovresti prendere in considerazione l'utilizzo dei metodi di FileManager urls (per: in :) e url (per: in: appropriateFor: create :). quali URL di ritorno, che sono il formato preferito.' – surfrider

0

Questo è quello che uso per ottenere il database. L'ho preso dalla classe di Stanford. Potrebbe aiutare qualcuno.

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

NSDocumentDirectory restituisce la directory Documenti, non la directory Support Application – Lupi

+0

Basta usare' NSApplicationSupportDirectory' invece di 'NSDocumentDirectory' –

6

solo per essere sicuro che le persone inizieranno a utilizzare il modo consigliato di fare questo:

- (NSArray<NSURL *> * _Nonnull)URLsForDirectory:(NSSearchPathDirectory)directory 
             inDomains:(NSSearchPathDomainMask)domainMask 

esempio Expanded dalla documentazione:

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

    if ([possibleURLs count] >= 1) { 
     // Use the first directory (if multiple are returned) 
     appSupportDir = [possibleURLs objectAtIndex:0]; 
    } 

    // If a valid app support directory exists, add the 
    // app's bundle ID to it to specify the final directory. 
    if (appSupportDir) { 
     NSString* appBundleID = [[NSBundle mainBundle] bundleIdentifier]; 
     appDirectory = [appSupportDir URLByAppendingPathComponent:appBundleID]; 
    } 

    return appDirectory; 
} 

collegamento Dimostrazione: https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW3

+0

La maggior parte usa il nome CFBundleExecutable per la directory finale, ma probabilmente hai ragione a consigliare l'uso dell'ID bundle dato che è più unico. Tuttavia, è necessario valutare se è possibile modificare l'eseguibile o l'ID bundle in futuro in modo da poter mantenere l'accesso ai dati. – malhal

23

Swift 4:

print(NSHomeDirectory()) 

o

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

e

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

questo funziona per me:

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

Crea classe C obiettivo separato per la lettura e la scrittura in directory documenti. Eviterò la riscrittura del codice. Di seguito è la mia versione di esso.

//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 
15

Swift 3:

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