2013-10-16 22 views
5

Ich habe alten Code, der bestimmte Ordner mit der alten FSFindFolder Routine findet. Jetzt habe ich die Aufgabe, diesen Code zu modernisieren. Zuerst mit NSFileManager 's URLForDirectory scheinen wie die richtige Wahl. Leider habe ich festgestellt, dass viele der Ordner, die Sie mit FSFindFolder finden konnten, nicht mehr von URLForDirectory unterstützt werden.Auffinden von Mac OS X-Ordnern mit URLForDirectory anstelle von FSFindFolder

Die Liste der Ordner, die Sie finden können mit FSFindFolder ist sehr lang und die meisten von ihnen sind nicht nützlich für meine sowieso.

Hier ist eine unvollständige Liste von FSFindFolder Konstanten, die ich Äquivalente tun müssen, um konvertieren und ihre URLForDirectory:

FSFindFolder     URLForDirectory 
============================== =============== 
kDesktopFolderType    NSDesktopDirectory 
kCachedDataFolderType   NSCachesDirectory 
kApplicationSupportFolderType NSApplicationSupportDirectory 
kTemporaryFolderType   located by calling NSTemporaryDirectory() 
kCurrentUserFolderType   located by calling NSHomeDirectory() 
kSystemFolderType    Not Available 
kPreferencesFolderType   Not Available 
kTrashFolderType    Not Available 
kAudioComponentsFolderType  Not Available 
kVolumeRootFolderType   Not Available 
kSharedUserDataFolderTypeNo  Not Available 

Meine Frage: Gibt es eine standardisierte Möglichkeit Pfade zu jedem der Ordner zu suchen markiert "Not Available" ohne zu verwenden FSFindFolder?

+0

Folgen Sie diesem Link http://stackoverflow.com/questions/18683345/cycle-through-a-directory-and-get-paths-of-all-the-files-and-folders/18688333#18688333 –

+0

@hussain -shabbir Frage 18683345 geht über die Dateien in einem Ordner - Es hat nichts mit meiner Frage zu tun. Meine Frage betrifft das Auffinden bestimmter Ordner. –

+0

Können Sie bitte etwas mehr erklären, was Sie erreichen möchten. Ich meine, was Output Sie benötigt ?? –

Antwort

1

Ich gehe von legacy documentation für die Definitionen der FSFindFolder Konstanten. Ich werde mein bestes tun, um fundierte Vermutungen über die Karten zu machen. Wenn ich also falsch liege, bitte klären Sie das und ich werde meine Antwort aktualisieren.

[NSFilemanager URLForDirectory:inDomain:appropriateForURL:create:error:] (documentation) kann Ihnen helfen, einige dieser Elemente zu finden. Es kann gefunden werden:

NSApplicationDirectory 
NSDemoApplicationDirectory 
NSDeveloperApplicationDirectory 
NSAdminApplicationDirectory 
NSLibraryDirectory 
NSDeveloperDirectory 
NSUserDirectory 
NSDocumentationDirectory 
NSDocumentDirectory 
NSCoreServiceDirectory 
NSAutosavedInformationDirectory 
NSDesktopDirectory 
NSCachesDirectory 
NSApplicationSupportDirectory 
NSDownloadsDirectory 
NSInputMethodsDirectory 
NSMoviesDirectory 
NSMusicDirectory 
NSPicturesDirectory 
NSPrinterDescriptionDirectory 
NSSharedPublicDirectory 
NSPreferencePanesDirectory 
NSApplicationScriptsDirectory 
NSItemReplacementDirectory 
NSAllApplicationsDirectory 
NSAllLibrariesDirectory 
NSTrashDirectory 

In Benutzer, lokalen, Netzwerk-und System-Domänen.

Das sollte auf kTrashFolderType aufpassen.

Soweit ich das beurteilen kann, kSystemFolderType wird immer der System Ordner im Stammverzeichnis (zB /System), so dass Sie nicht danach suchen müssen. kPreferencesFolderType gibt den Ordner "Preferences" im Systemordner an. Ich bin mir nicht sicher, was das bedeutet, da es keinen "Präferenzen" Ordner in /System/Library gibt. Dort ist aber ein Ordner bei /Library/Preferences. Dies ist auch ein statischer Ort.

Nicht sicher über kAudioComponentsFolderType, kVolumeRootFolderType und kSharedUserDataFolderTypeNo off-hand.

3

Ich würde empfehlen, dass Modernisierungscode in den meisten Fällen bedeutet, weg von dem, was Sie diese Ordner-Standorte für in erster Linie zu verschieben. Zum Beispiel gibt es nicht viel legitimen Gebrauch für ein Äquivalent von kSystemFolderType in modernen Code. Sie sollten jeden Fall, in dem Sie diese verwenden, untersuchen und nach der richtigen Lösung für das Problem auf hoher Ebene fragen, das diese alte Implementierung gelöst hat.

Wenn Sie auf dem Weg aussehen tun müssen Pfade, um einige dieser Ordner, Ihre beste Wette ist, um wirklich, dass FSFindFolder() gibt, finden die NSSearchPathDirectory bekommt man am nächsten, und dann schreiben Sie einfach Ihren Code, der von URLForDirectory:... und fügen Sie das bekommen Differenz als statischer relativer Pfad.

Einige spezifische Empfehlungen:

kPreferencesFolderType: NSUserDefaults zum Speichern von Einstellungen verwenden; Speichern von Nicht-Standardwerten in der Anwendungsunterstützung

kTrashFolderType: Verwenden Sie -[NSWorkspace recycleURLs:completionHandler:] oder -performFileOperation:source:destination:files:tag: mit NSWorkspaceRecycleOperation; nur bei Bedarf verwenden -[NSFileManager URLForDirectory:...] mit NSTrashDirectory

kVolumeRootFolderType: Wenn Sie diese mit einem bestimmten Volumen ref anstatt eine Domäne verwenden, verwenden -[NSURL getResourceValue:forKey:error:] mit Schlüssel NSURLVolumeURLKey

kSharedUserDataFolderType: -URLForDirectory:... mit NSUserDirectory und dann @"Shared" als anhängen Pfadkomponente

kAudioComponentsFolderType: Der Komponentenmanager ist veraltet; Apple says gibt es keinen genauen Ersatz, aber für einige Zwecke ist Audio Component Services geeignet.

+1

"Apple sagt ..." ist mir nicht mehr gut genug. Ich brauche Standardordner, um konsistent zu sein. Die Verlagerung weg von der vorherigen Ordnerposition bedeutet auch, dass die Abwärtskompatibilität für meine Benutzer wegfällt. Ich habe Benutzer, die für die letzten 15 Jahre oder so ihre Einstellungen in den Ordner unter ~/Library/Preferences gespeichert haben. In letzter Zeit hat Apple eine neue Melodie, auf die der Preferences-Ordner nicht direkt zugegriffen werden kann. OTOH Ich fürchte, FSFindFolder wird in zukünftigen Systemen nicht unterstützt und möchte daher modernen Cocoa-Code verwenden. –