Подтвердить что ты не робот

Проверка существования файла с использованием NSURL

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

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

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

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

Существует ли простой способ или функция в Cocoa, CF или основных службах, которые гарантируют/документируют, чтобы сообщить мне, относится ли данный файл (или ссылка на файл) к объекту файловой системы?

4b9b3361

Ответ 1

У 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];

Ответ 2

В iOS я не нашел другого пути...

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"];
if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...}

Ответ 3

Вот ответ Swift 2:

var error:NSError?
let folderExists = theURL.checkResourceIsReachableAndReturnError(&error)

Ответ 4

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

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

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

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

Ответ 5

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

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