2010-01-23 4 views
3

Как взять файл в каталоге приложения (в той же папке, в которой находится .app), и получить абсолютный путь. Скажем, относительный путь «Data/file.txt», как бы я использовал Objective C, чтобы получить это как абсолютный путь? У меня есть пользователь, который вводит имя своей домашней папки, если это какая-то помощь.Изменение относительного URL-адреса для абсолютного URL-адреса в Objective C

Пожалуйста, помогите,

HiGuy

+4

Не имеет отношения к вашему вопросу, но предложение в любом случае. Как пользователь Mac, я бы счел это грубым, когда приложение должно жить в специальной структуре папок. Я хочу иметь возможность перетащить один файл .app в папку «Мои приложения» и сделать это. Я предпочитаю поддерживать файлы для входа в/Library/Application Support или ~/Library/Application Support. В вашем случае может потребоваться другое решение, но сначала посмотрите, можете ли вы придерживаться этого стандарта. –

+0

@ DanielYankowsky - я вижу вашу точку зрения, но на самом деле предпочтительнее добавлять файлы поддержки, которые в противном случае были бы невидимыми для пользователя в основном пакете ... Это упрощает удаление приложения и все связанное с ним детрит, а также все еще позволяя самому переместить файл приложения. Создание структуры поддержки (даже если в «правильном» месте) оставляет мусор при удалении. Теперь пользовательские данные - это еще одна история, и ~/Library/..., вероятно, является подходящим местом для такого рода вещей. – BadPirate

+0

@BadPirate Исходное сообщение, похоже, не спрашивало, как получить файлы ресурсов из * в * каталоге .app, но вместо этого как получить путь к файлу * в сторону * каталога .app. Это то, что я рекомендовал. –

ответ

1

Найти местоположение запущенного приложения, выполнив:

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

который будет возвращать что-то вроде:

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

- (NSString *)stringByDeletingLastPathComponent Затем используйте отрубить последний бит.

1

Вы просто должны быть в состоянии объединить корневую папку приложения, с относительным путем. Вы можете получить в приложение домашней директории с NSHomeDirectory(), так чтобы получить абсолютный путь, который вы можете сделать что-то вроде следующего:

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

Не имеет прямого отношения к вашему ответу, но NSHomeDirectory() фактически дал мне «/ Users/MyUserName /» вместо (путь к приложению). Вместо этого я использовал NSHomeDirectory() для автоматического получения домашнего каталога без использования NSTextField. –

14

Я бы использовать NSURL методы разрешения URL-адресов для меня, например, так:

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

«../» необходимо, потому что в противном случае было бы попытаться найти файл внутри ваш приложение. Положив «../» заблаговременно, он скажет, что он будет выглядеть в папке, содержащей папку, а не в самом пакете. Кроме того, -[NSBundle bundleURL] является API 10.6+, но тривиально реплицировать функциональность, используя метод удобства NSURL и -[NSBundle bundlePath].