Получение ссылок/путей к файлам пакетов при запуске приложения

Предположим, у меня есть произвольный набор файлов, включенных в основной пакет приложений. Я хотел бы получить URL-адреса файлов для тех, кто запускается, и хранить их где-нибудь. Возможно ли это с помощью NSFileManager? Документация неясна в этом отношении.

Примечание. Мне нужны только URL-адреса файлов, мне не нужен доступ к фактическим файлам.


person Andrew Lauer Barinov    schedule 30.08.2012    source источник
comment
Что такое ссылка на файл? Дорожка? URL? Какой?   -  person    schedule 31.08.2012
comment
Под ссылкой на файл я имею в виду URL-адрес файла   -  person Andrew Lauer Barinov    schedule 31.08.2012


Ответы (4)


Вы можете получить URL-адрес файла в основном комплекте, используя

NSString *path = [[NSBundle mainBundle] pathForResource:@"SomeFile" ofType:@"jpeg"];
NSURL *url = [NSURL fileURLWithPath:path];

Вы можете записать этот URL-адрес, например, в файл списка свойств в каталоге Documents:

NSString *docsDir = [NSSearchForDirectoriesInDomains(NSDocumentsDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *plistPath = [docsDir stringByAppendingPathComponent:@"Files.plist"];
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[url absoluteString] forKey:@"SomeFile.jpeg"];
[dict writeToFile:plistPath atomically:YES];

Если вы не знаете имен файлов и хотите просто перечислить все файлы в комплекте, используйте

NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[NSBundle mainBundle] bundlePath] error:NULL];
for (NSString *fileName in files) {
    NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
    // do something with `url`
}
person Community    schedule 30.08.2012
comment
Что делать, если я не знаю имен файлов, я просто хочу, чтобы все файлы были там? - person Andrew Lauer Barinov; 31.08.2012
comment
@AndrewLauerBarinov, тогда вы можете прочитать документы NSFileManager. (Но в любом случае посмотрите правку...) - person ; 31.08.2012
comment
Спасибо за дополнительную информацию! - person Andrew Lauer Barinov; 31.08.2012

Или в Свифт 4:

        let url = Bundle.main.url(forResource: "FileName", withExtension: ".xyz")
person Bersaelor    schedule 17.03.2018
comment
чтобы использовать это, где я должен сохранить свой файл ?? Нужно ли мне также включать файл в проект? - person user3390652; 30.09.2018
comment
@user3390652 user3390652 ваш файл должен быть добавлен в проект и часть цели. Все файлы, отмеченные галочкой для цели, будут доступны в составе основного пакета. - person Bersaelor; 11.10.2018

Да, вы получите их путь:

NSString *path = [NSBundle mainBundle] pathForResource:@"file1" ofType:@"png"];
NSURL *fileURL = [NSURL fileURLWithPath:path]

// save it as any other object or in a dictionary:

[myMutableDictionary setObject:fileURL forKey:@"file1.png"];

РЕДАКТИРОВАТЬ: чтобы получить полный список файлов, используйте NSFileManager, получите путь к самому пакету, затем пройдитесь по каждому каталогу, получая файлы, создавая URL-адреса и сохраняя их где-нибудь. На SO есть куча кода, как пройтись по каталогу, чтобы сделать это. [Вы должны обновить свой вопрос, чтобы уточнить, что вы хотите, изначально это не было ясно]

person David H    schedule 30.08.2012
comment
Что делать, если я не знаю имен файлов, я просто хочу, чтобы все файлы были там? - person Andrew Lauer Barinov; 31.08.2012

На NSBundle есть API (documentation), доступный в 10.6 или iOS 4, чтобы получить NSURL напрямую, а не передавать путь конструктору NSURL:

- (NSURL *)URLForResource:(NSString *)name withExtension:(NSString *)ext;

У него также есть варианты, которые принимают subdirectory и localizationName, такие же, как и его эквиваленты -pathForResource:.

person Dov    schedule 04.08.2014