2012-04-10 10 views
2

Angesichts einer App namens ExampleApp, ich möchte "~/Library/Logs/ExampleApp" grundsätzlich ohne Verwendung hart codierter Pfade finden. Es gibt NSSearchPathForDirectoriesInDomains, mit denen Sie mithilfe des NSApplicationSupportDirectory-Suchbegriffs Dinge wie "~/Library/Application Support/ExampleApp" finden können, aber es scheint kein Suchbegriff für die Protokollierung zu sein.Wie programmiere ich programmgesteuert das Protokollierungsverzeichnis des Benutzers?

Ich glaube nicht, ~/Library/Logs ist nicht Standard, da CrashReporter seine Protokolle dort legt.

+0

FYI: Wenn Sie den Mac App Store verwenden möchten, können Sie das Verzeichnis Library/Logs nicht verwenden, es ist kein zugelassenes Verzeichnis. Sie müssen das Protokoll einer Anwendung in den Ordner innerhalb der Anwendungsunterstützung schreiben. – CRD

+0

CRD: Ich dachte, eine Sandbox-App hatte uneingeschränkten Zugriff auf ihre Container und Unterverzeichnisse? Zum Beispiel existiert auf meinem System ein Verzeichnis ~/Library/Containers/com.apple.TextEdit/Data/Library/Logs (es ist nichts drin) –

+0

Das könnte eine Grauzone sein, aber ich denke eine * Mac App Die Sandbox-App Store * erhält Zugriff auf die Schnittmenge der vom MAS und dem Sandbox-Container zugelassenen Ordner. – CRD

Antwort

3

Versuchen Sie folgendes:

NSString* libraryPath = [NSHomeDirectory stringByAppendingPathComponent:@"Library/Logs"]; 

aktualisieren (~/Library/Logs/AppName):

NSString* bundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; 
NSString* logsPath = [NSString stringWithFormat:@"Library/Logs/%@",bundleName]; 

NSString* libraryPath = [NSHomeDirectory stringByAppendingPathComponent:logsPath]; 
+0

Ich habe meine Frage leicht geändert, um den Namen der App anzugeben. –

+0

@NickSonneveld Ich habe gerade meine Antwort aktualisiert; Guck mal. :-) –

+0

nett! Ich endete mit NSSearchPathForDirectoriesInDomains (NSLibraryDirectory, ...), um das Bibliotheksverzeichnis des Benutzers zu erhalten, aber es ist alles gut! –

1

Cocoa bietet keine Mittel für alle der Suche nach Standardverzeichnisse. Die alte FSFindFolder()-Funktion kann viel mehr bieten, beinhaltet aber die Konvertierung von einem FSRef zurück in einen Pfad oder eine URL. Apple rät davon ab, es zu verwenden, aber es ist immer noch der einzige Weg, um bestimmte Standardverzeichnisse ohne Festcodierung zu erhalten. Das heißt, es wird niemals den Namen Ihrer App enthalten. Sie müssen das anhängen.

Bearbeitet hinzuzufügen: die link to the legacy docs.

+0

In welcher Weise rät Apple von seiner Verwendung ab? Ab dem 10.7 SDK ist es nicht veraltet. – JWWalker

+0

@JWWalker, finden Sie es in den Nicht-Legacy-Dokumenten und ich werde diesen Anspruch zurückziehen. ;) –

+0

Nun, die Dinge werden in den alten Großhandel verlagert, aber veraltet, Stückwerk, und ich denke, Abwertung ist ein offizieller Weg, eine bestimmte Funktion zu entmutigen. – JWWalker

Verwandte Themen