2010-01-23 9 views
3

Comment puis-je prendre un fichier dans le répertoire de l'application (le même dossier que le fichier .app) et obtenir son chemin absolu. Supposons que le chemin relatif soit "Data/file.txt", comment utiliser Objective C pour l'obtenir comme un chemin absolu? J'ai l'utilisateur d'entrer leur nom de dossier de base, si cela aide.Modifier une URL relative en URL absolue dans l'objectif C

S'il vous plaît aider,

HiGuy

+4

Non directement lié à votre question, mais une suggestion quand même. En tant qu'utilisateur Mac, je trouverais cela impoli quand une application doit vivre dans une structure de dossier spécial. Je veux pouvoir faire glisser un .app dans mon dossier/Applications et être fait. Je préfère soutenir les fichiers pour aller dans/Bibliothèque/Application Support ou ~/Bibliothèque/Application Support. Votre cas pourrait appeler une solution différente, mais d'abord voir si vous pouvez adhérer à cette norme. –

+0

@DanielYankowsky - Je vois ce que vous voulez dire, mais il est préférable de mettre des fichiers de support qui devraient être invisibles à l'utilisateur dans le bundle principal ... Il est donc plus facile de supprimer l'application et tous ses détritus, ainsi que permettant au fichier d'application d'être déplacé lui-même. La création de la structure de support (même si dans l'endroit «approprié») laisse des ordures sur la désinstallation. Maintenant, les données spécifiques à l'utilisateur sont une autre histoire, et ~/Library/... est probablement le bon endroit pour ce genre de choses. – BadPirate

+0

@BadPirate La publication originale ne semblait pas demander comment obtenir des fichiers de ressources à partir de * dans * le répertoire .app, mais plutôt comment obtenir un chemin vers un fichier * de côté * le répertoire .app. C'est ce que je recommandais contre. –

Répondre

1

Trouver l'emplacement de l'application en cours d'exécution en faisant:

NSString * applicationPath = [[NSBundle mainBundle] bundlePath]; 

qui retournera quelque chose comme:

/Users/myUser/Library/Application Support/iPhone Simulator/User/Applications/317CF5C7-57B3-42CE-8DF4-4DD10B070D95/Assignment1a.app 

utilisez ensuite - (NSString *)stringByDeletingLastPathComponent pour couper le dernier bit.

1

Vous devriez juste être en mesure de concaténer le dossier racine de l'application, avec le chemin relatif. Vous pouvez obtenir dans le répertoire de l'application avec NSHomeDirectory(), afin d'obtenir le chemin absolu, vous pouvez faire quelque chose comme ce qui suit:

NSString *path = [NSHomeDirectory() stringByAppendingString: @"/Data/file.txt"]; 
+0

Non directement lié à votre réponse, mais NSHomeDirectory() m'a réellement donné "/ Users/MyUserName /" au lieu de (chemin d'accès à l'application). J'ai, à la place, utilisé NSHomeDirectory() pour obtenir automatiquement le répertoire de base, sans l'utilisation d'un NSTextField. –

14

J'utilise les méthodes NSURL qui résolvent les URL pour moi, comme ceci:

NSURL * bundle = [[NSBundle mainBundle] bundleURL]; 
NSURL * file = [NSURL URLWithString:@"../Data/file.txt" relativeToURL:bundle]; 
NSURL * absoluteFile = [file absoluteURL]; 

Le « ../ » est nécessaire, car il serait contraire essayer de localiser le fichier dans votre bundle d'application. Mettre le "../" au préalable lui indiquera de regarder dans le dossier contenant le paquet, et pas dans le paquet lui-même. En outre, -[NSBundle bundleURL] est une API 10.6+, mais il est trivial de répliquer la fonctionnalité en utilisant une méthode pratique NSURL et -[NSBundle bundlePath].