Тестирование существования файла с использованием NSURL - PullRequest
70 голосов
/ 18 декабря 2009

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

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

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

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

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

Ответы [ 6 ]

136 голосов
/ 18 декабря 2009

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];
29 голосов
/ 20 января 2011

В iOS я не мог найти другой способ ...

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"];
if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...}
10 голосов
/ 28 января 2016

Вот ответ Swift 2 :

var error:NSError?
let folderExists = theURL.checkResourceIsReachableAndReturnError(&error)
2 голосов
/ 24 апреля 2010

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

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

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

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

1 голос
/ 18 декабря 2009

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

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

0 голосов
/ 25 июня 2018

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

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

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

...