2010-11-03 3 views
2

J'ai une application OS X en tant que package .app qui peut résider dans n'importe quel emplacement arbitraire dans le système de fichiers. Existe-t-il un moyen de trouver le chemin actuel du paquet avec.Comment trouver le répertoire résident d'un package d'application OS X - par programme

NOTE

getcwd() ne fonctionne pas depuis le répertoire courant de tous les paquets ouvert est par un clic-ouvert ou en utilisant la commande d'ouverture est «/». Si j'appelle l'exécutable depuis myapp.app/Contents/MacOS, le répertoire s'affiche correctement. C'est une application de cacao.

Des indices?

Répondre

7

Vous devriez pouvoir trouver l'emplacement du .app par [[NSBundle mainBundle] bundleURL]; ou [[NSBundle mainBundle] bundlePath];.

Cependant, vous souhaitez probablement accéder aux ressources à l'intérieur du fichier .app en passant par NSBundle pour les localiser dans la plupart des cas (ceci concerne des problèmes tels que la localisation).

Remarque: Si vous envisagez de modifier l'ensemble d'applications; ne le fait pas. Vous ne devez pas, ne pouvez pas et ne devez pas supposer que vous avez un accès en écriture à l'ensemble d'applications; et si vous le faites, quelque chose est probablement très mauvais.

Editer: En tant que point d'intérêt, si vous écrivez un programme C sous OS X et devez trouver l'emplacement de l'exécutable; vous pouvez utiliser une déclaration principale non-portable comme ceci:

int main (int argc, const char *argv[], const char *env[], const char *path[]) { 
    // path[0] now contains the path to the executable 
    // NOT PORTABLE! OS X ONLY! 
    return 0; 
} 
+0

Works très bien. Merci beaucoup! –

+0

@Deepak Narayan: Je dois reformuler mes deux points auxiliaires: Ne supposez pas que vous pouvez modifier le bundle d'application, et accéder aux ressources par le biais de '-urlForResource: ofKind:' de 'NSBundle' et des amis. –

+0

Merci. Je ne cherche pas à modifier le bundle, j'ai juste besoin du chemin du répertoire pour changer de répertoire et charger quelques fichiers du répertoire où est le .app. –

2

La construction de la version argv[0] ci-dessus, vous pouvez également obtenir le chemin de:

NSArray* arguments = [[NSProcessInfo processInfo] arguments]; 

    NSString* exe = [args objectAtIndex:0]; 

de init ou applicationDidFinishLaunching

+1

Vous devriez vous efforcer de rendre vos réponses autonomes; d'autres réponses peuvent être éditées, supprimées ou simplement bouger pour ne plus être "au-dessus" des vôtres. – KRyan

Questions connexes