Тестирование существования файла с помощью NSURL

Snow Leopard представил много новых методов для использования объектов NSURL относиться к файлам, не путям или FSRefs Core Services.

Однако существует одна задача, для которой я не могу найти ОСНОВАННЫЙ НА URL метод: Тестирование, существует ли файл. Я ищу ОСНОВАННУЮ НА URL версию - [NSFileManager fileExistsAtPath:]. Как этот метод, это должно возвратиться YES если URL описывает что-нибудь, является ли это регулярным файлом, каталогом или чем-либо еще.

Я мог попытаться искать различные значения ресурса, но ни один из них, как явно не гарантируют, не будет существовать, если файл не сделает, и некоторые из них (например, NSURLEffectiveIconKey) могли бы быть дорогостоящими, если он делает.

Я мог просто использовать NSFileManager fileExistsAtPath:, но если бы существует более современный метод, я предпочел бы использовать это.

Существует ли простой метод или функция в Cocoa, Калифорния или Core Services, которая это гарантируется/документируется, чтобы сказать мне, относится ли данный файл (или ссылка на файл) URL к объекту файловой системы, который существует?

70
задан Peter Hosey 18 December 2009 в 11:45
поделиться

3 ответа

NSURL имеет следующий метод:

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error

который «Возвращает, доступен ли ресурс, на который указывает URL-адрес файла»

NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" 
               isDirectory:NO];
NSError *err;
if ([theURL checkResourceIsReachableAndReturnError:&err] == NO)
    [[NSAlert alertWithError:err] runModal];
138
ответ дан 24 November 2019 в 13:17
поделиться

Поскольку NSURL может представлять больше, чем локальные файловые системы, я не думаю, что существует универсальный метод, который может надежно проверить их существование. По крайней мере, какао-фундамент не содержит такой функции (насколько мне известно).

Если вы имеете дело только с локальными файловыми системами, я предлагаю вам создать категорию для NSURL или для NSFileManager , с сообщением urlExists: . Он преобразует NSURL в NSString (нормализованный путь), а затем вызовет сообщение [NSFileManager fileExistsAtPath:] .

1
ответ дан 24 November 2019 в 13:17
поделиться

Определение того, ссылается ли данный URL-адрес файла (или ссылки на файл) на существующий объект файловой системы, по своей сути является дорогостоящим для удаленных ресурсов, API только 10.6 (без iPhoneOS) для этого CFURLResourceIsReachable () и [NSURL checkResourceIsReachableAndReturnError:] оба синхронны, даже если вы будете их использовать, для большого количества файлов вы все равно столкнетесь со значительными накладными расходами на задержку.

Что вам следует сделать, так это реализовать свою собственную процедуру асинхронной проверки с кэшированием, которая отдельно создает список допустимых ресурсов.

В противном случае примечания для CFURLResourceIsReachable в состоянии заголовка:

Примером может служить периодическое поддержание состояния пользовательского интерфейса, которое зависит от существования конкретного документа. При выполнении операции , такой как открытие файла, более эффективно просто попробовать операцию и обработать сбои, чем сначала проверить достижимость.

2
ответ дан 24 November 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: