Тестирование существования файла с помощью NSURL
Snow Leopard представил много новых методов для использования объектов NSURL для ссылки на файлы, а не на пути или FSRefs основных служб.
однако есть одна задача, для которой я не могу найти метод на основе URL: проверить, существует ли файл. Я ищу на основе URL-адресов версии -[NSFileManager fileExistsAtPath:
]. Как и этот метод, он должен возвращать YES
если URL-адрес описывает что-либо, будь то обычный файл, каталог или что-нибудь еще.
я мог бы попытаться посмотрите вверх различные значения ресурсов, но ни один из них явно не гарантируется, если файл не существует, а некоторые из них (например,NSURLEffectiveIconKey) может быть дорогостоящим, если он делает.
я мог бы просто использовать NSFileManager в fileExistsAtPath:
, но если есть более современный метод, я бы предпочел использовать его.
есть ли простой метод или функция в Cocoa, CF или Core Services, которые гарантированы / документированы, чтобы сообщить мне, является ли данный файл (или file-reference) URL ссылается на объект файловой системы, который существует?
6 ответов:
NSURL имеет этот метод:
- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error
Which " возвращает, может ли быть достигнут ресурс, на который указывает URL-адрес файла."
NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" isDirectory:NO]; NSError *err; if ([theURL checkResourceIsReachableAndReturnError:&err] == NO) [[NSAlert alertWithError:err] runModal];
на iOS я не мог найти другого способа...
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"]; if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...}
здесь Swift 2 ответ:
var error:NSError? let folderExists = theURL.checkResourceIsReachableAndReturnError(&error)
определение того, относится ли данный файл (или ссылка на файл) URL к объекту файловой системы, который существует, по своей сути является дорогостоящим для удаленных ресурсов, только 10.6 (без iPhoneOS) api для этого CFURLResourceIsReachable() и [NSURL checkResourceIsReachableAndReturnerror:] являются синхронными, даже если вы будете их использовать, для многих файлов вы все равно будете смотреть на значительную задержку.
Что вы должны сделать, это реализовать свою собственную асинхронную процедуру проверки с помощью кэширование, которое отдельно создает список допустимых ресурсов.
в противном случае примечания для CFURLResourceIsReachable в состоянии заголовка :
примером может быть периодическое обслуживание состояния пользовательского интерфейса, которое зависит о существовании того или иного документа. При выполнении операция, такая как открытие файла, более эффективна, чтобы просто попробовать работа и обработка сбоев, чем сначала проверить достижимость.
поскольку NSURL может представлять больше, чем локальные файловые системы, я не думаю, что существует общий метод, который может проверить их существование надежным способом. По крайней мере, какао-основа не содержит такой функции (насколько я знаю).
если вы имеете дело только с локальными файловыми системами, я предлагаю вам создать Категорию для
NSURL
илиNSFileManager
СurlExists:
сообщение. Он бы преобразовалNSURL
доNSString
(нормализованный путь) и затем вызвать[NSFileManager fileExistsAtPath:]
сообщение.
в Swift вы можете использовать
checkResourceIsReachable()
метод, который, к сожалению, либо вернетtrue
(Если файл доступен) или выдать ошибку (объясняя, почему он не может быть достигнут).чтобы получить значение bool true/false, используйте следующий синтаксис:
let exists = (try? inputFile.checkResourceIsReachable()) ?? false
если вы хотите зарегистрировать ошибку:
let exists: Bool do { exists = try inputFile.checkResourceIsReachable() } catch { exists = false print(error.localizedDescription) }
имейте в виду, что это дорогостоящая операция, и она может быть устаревшей сразу после (если какой-либо другой процесс удаляет или размонтирует файл на диске пока вы проверяете, существует ли он).
В общем случае предпочтительный подход заключается не в том, чтобы проверить, существует ли файл, а просто попытаться прочитать или записать в файл и обработать любую ошибку после этого, если это не удается.