2013-10-16 19 views
5

Ho un vecchio codice che trova cartelle specifiche utilizzando la vecchia routine FSFindFolder. Ora ho il compito di modernizzare questo codice. Inizialmente utilizzando NSFileManager 's URLForDirectory sembra la scelta giusta. Purtroppo ho scoperto che molte delle cartelle che è possibile individuare utilizzando FSFindFolder non sono più supportate da URLForDirectory.Individuazione delle cartelle Mac OS X utilizzando URLForDirectory anziché FSFindFolder

L'elenco di cartelle che è possibile individuare utilizzando FSFindFolder è molto lungo e la maggior parte di esse non è comunque utile.

Ecco una lista parziale di FSFindFolder costanti che ho bisogno di convertire e loro URLForDirectory equivalenti:

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 

La mia domanda: esiste un modo standard per individuare percorsi per ciascuna delle cartelle contrassegnato come "Non disponibile" senza utilizzare FSFindFolder?

+0

Seguire questo collegamento http://stackoverflow.com/questions/18683345/cycle-through-a-directory-and-get-path-of-all-the-files-and-folders/18688333#18688333 –

+0

@hussain -shabbir La domanda 18683345 riguarda l'attraversamento dei file in una cartella: non ha nulla a che fare con la mia domanda. La mia domanda riguarda l'individuazione di cartelle specifiche. –

+0

Puoi spiegare un po 'di più cosa vuoi ottenere. Intendo quale output hai richiesto ?? –

risposta

1

Sto andando fuori dallo legacy documentation per le definizioni delle costanti FSFindFolder. Farò del mio meglio per fare ipotesi plausibili su come si mappano, quindi se ho torto, ti prego di chiarire e aggiornerò la mia risposta.

[NSFilemanager URLForDirectory:inDomain:appropriateForURL:create:error:] (documentation) può aiutarti a trovare alcuni di questi articoli. Può trovare:

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 

Nei domini Utente, Locale, Rete e Sistema.

Che dovrebbe occuparsi di kTrashFolderType.

Per quanto posso dire, kSystemFolderType sarà sempre la cartella System nella directory principale (ad esempio /System) in modo da non doverla cercare. kPreferencesFolderType specifica la cartella Preferenze nella Cartella Sistema. Non sono sicuro di cosa significhi, in quanto non esiste una cartella "preferenze" in /System/Library. Lì è tuttavia una cartella su /Library/Preferences. Anche questa è una posizione statica.

Non sicuro su kAudioComponentsFolderType, kVolumeRootFolderType e kSharedUserDataFolderTypeNo a portata di mano.

3

Vorrei raccomandare che il codice di modernizzazione, nella maggior parte dei casi, significhi spostarsi da qualunque cosa stiate usando questi percorsi di cartelle per il primo posto. Ad esempio, non c'è molto uso legittimo per un equivalente di kSystemFolderType nel codice moderno. Dovresti esaminare ogni caso in cui stai usando questi e chiedere quale sia la soluzione giusta per risolvere il problema di alto livello che quella vecchia implementazione stava risolvendo.

Se si ha realmente bisogno percorsi di alcune di queste cartelle, la soluzione migliore è quello di guardare il percorso che FSFindFolder() dà, trovare quale NSSearchPathDirectory si ottiene più vicino, e poi basta scrivere il codice per ottenere che da URLForDirectory:... e aggiungere il differenza come percorso relativo statico.

Alcune raccomandazioni specifiche:

kPreferencesFolderType: utilizzare NSUserDefaults per memorizzare le preferenze; memorizzare non predefiniti in Application Support

kTrashFolderType: utilizzare -[NSWorkspace recycleURLs:completionHandler:] o -performFileOperation:source:destination:files:tag: con NSWorkspaceRecycleOperation; solo se necessario, utilizzare -[NSFileManager URLForDirectory:...] con NSTrashDirectory

kVolumeRootFolderType: se si sta utilizzando questo con una specifica ref di volume, piuttosto che un dominio, utilizzare -[NSURL getResourceValue:forKey:error:] con chiave NSURLVolumeURLKey

kSharedUserDataFolderType: -URLForDirectory:... con NSUserDirectory e quindi aggiungere @"Shared" come componente di percorso

kAudioComponentsFolderType: il Gestore componenti è obsoleto; Apple says non esiste una sostituzione esatta, ma per alcuni scopi è appropriato Audio Component Services.

+1

"Apple dice ..." non è più abbastanza buono per me. Ho bisogno che le posizioni delle cartelle standard siano coerenti. Spostarsi lontano dalla posizione della cartella precedente significa anche spostarsi dalla compatibilità a ritroso per i miei utenti. Ho utenti che negli ultimi 15 anni hanno salvato le loro preferenze nella cartella ~/Library/Preferences. Ultimamente Apple ha un nuovo motivo, in cui la cartella Preferenze non è accessibile direttamente. OTOH Ho paura che FSFindFolder non sarà supportato nei sistemi futuri e quindi voglio usare il moderno codice Cocoa. –