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


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

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

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

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

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

6 70

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)
}

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

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