it-swarm.com.de

Programmgesteuerter Pfad zum Ordner "Application Support"

Ich versuche, einen NSString für den Application Support-Ordner des Benutzers zu erhalten.

Ich weiß, dass ich NSString *path = @"~/Library/Application Support"; kann, aber das scheint nicht sehr elegant zu sein. Ich habe mit NSSearchPathForDirectoriesInDomains herumgespielt, aber es scheint ziemlich langatmig zu sein und erzeugt mehrere unnötige Objekte (zumindest meine Implementierung).

Gibt es eine einfache Möglichkeit, dies zu tun?

52
Jack James

Dies ist veraltet, verwenden Sie FileManager.default.urls(for:in:) für die aktuelle bewährte Methode, wie im Kommentar von @ andyvn22 unten.

am besten verwenden Sie NSSearchPathForDirectoriesInDomains mit NSApplicationSupportDirectory als "langatmig".

Beispiel:

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

NSLog-Ausgabe:

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

Swift 4:

print(NSHomeDirectory())

oder

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

und

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

Nur um sicherzugehen, dass die Leute beginnen, die empfohlene Methode zu verwenden:

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

Erweitertes Beispiel aus der Dokumentation:

- (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;
}

Testlink: https://developer.Apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//Apple_ref/doc/uid/TP40010672-CH3-

7
Ivan Karpan

Das funktioniert für mich:

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

Erstellen Sie eine separate Objective-C-Klasse zum Lesen und Schreiben in das Dokumentenverzeichnis. Ich werde das erneute Schreiben von Code vermeiden. Unten ist meine Version davon.

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

Dies ist, was ich benutze, um die Datenbank zu bekommen. Hab es von der Stanford-Klasse bekommen. Es könnte jemandem helfen.

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