2016-12-20 5 views
0

Von meiner Mac OS App habe ich versucht, Anwendungen aktuelle Verzeichnis mit folgenden Code zum Generieren einer Protokolldatei im App-Bundle-Pfad zu erhalten.Korrekter Weg, um Anwendungsverzeichnispfad in Mac App zu erhalten

NSString *path = [[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:@"TSPlogfile.txt"]; 

Es funktionierte gut, wenn ich die Anwendung von Xcode laufen gefunden, aber [[NSFileManager defaultManager] currentDirectoryPath] kehrt / nur während der applicationxxx.app von Finder läuft.

Später löste ich dies von [[[NSBundle mainBundle].bundlePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"TSPlogfile.txt"];

mit Dies funktioniert in beiden Fällen (App von Xcode läuft und von Finder)

Können Sie erklären, warum die [[NSFileManager defaultManager] currentDirectoryPath] ausfällt, während App Finder läuft?

Antwort

4

gibt Sie sollten nichts an das Paket oder den Ordner schreiben, in dem sich die App befindet. Und wenn Ihre App sandboxed ist, könnten Sie nicht.

Verwenden Sie die „Application Support“ Ordner statt:

NSError *error; 
NSFileManager *manager = [NSFileManager defaultManager]; 
NSURL *applicationSupport = [manager URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:false error:&error]; 
NSString *identifier = [[NSBundle mainBundle] bundleIdentifier]; 
NSURL *folder = [applicationSupport URLByAppendingPathComponent:identifier]; 
[manager createDirectoryAtURL:folder withIntermediateDirectories:true attributes:nil error:&error]; 
NSURL *fileURL = [folder URLByAppendingPathComponent:@"TSPlogfile.txt"]; 

Ich habe Nutzung NSURL Implementierung oben, aber das gleiche Konzept gilt, wenn Pfade benutzen, auch.

Siehe File System Programming Guide: OS X Library Directory Details.

Sie fragen:

Können Sie erklären, warum die [[NSFileManager defaultManager] currentDirectoryPath] während App Finder läuft ausfällt?

Der Ordner, den Sie im Finder sehen, ist nicht das gleiche wie das "aktuelle Verzeichnis", wenn die App ausgeführt wird. Kurz gesagt, das "aktuelle Verzeichnis" hat nichts damit zu tun, wo sich die App befindet.

0

Dies ist, wie Sie das Verzeichnis bekommen, wo Sie Ihre App-Bundle befindet:

NSURL *appFolder = [[[NSBundle mainBundle] bundleURL] URLByDeletingLastPathComponent]; 

Dies Sie die Pfade zu den Anwendungsordner (/ Programme und ~/Applications)

NSArray *paths =[[NSFileManager defaultManager] URLsForDirectory:NSApplicationDirectory inDomains:NSLocalDomainMask]; 
Verwandte Themen