Проверьте, существует ли файл по URL вместо пути

Как я могу проверить, существует ли файл по URL (а не по пути), чтобы установить предварительно заполненное хранилище по умолчанию в iPhone Simulator:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
/*
 Set up the store.
 For the sake of illustration, provide a pre-populated default store.
 */
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Food" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
}

Я читал, что в последних версиях шаблонов метод applicationDocumentsDirectory возвращает URL-адрес, поэтому я изменил код, чтобы использовать объекты NSURL для представления пути к файлу. Но в [fileManager fileExistsAtPath:storePath], Мне нужно изменить fileExistsAtPath что-то вроде fileExistsAtURL (очевидно, его не существует).

Я проверил ссылку на класс NSFileManager и не нашел ни одной подходящей задачи, подходящей для моей цели.

Любые намеки, пожалуйста?

4 ответа

Решение
if (![fileManager fileExistsAtPath:[storeURL path]]) 
...

Из документации:

Если этот объект URL содержит URL файла (как определено с помощью isFileURL), возвращаемое значение этого метода подходит для ввода в методы NSFileManager или NSPathUtilities. Если путь имеет косую черту, он удаляется.

Для URL файловой системы NSURL сам по себе есть метод для проверки доступности URL

NSError *error;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
if ([storeURL checkResourceIsReachableAndReturnError:&error]) {
  // do something
} else {
  NSLog(@"%@", error);
}
if (![fileManager fileExistsAtPath:[storeURL path]]) 

это нормально, но будьте осторожны: для URL, как:

..../Documents/1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50

[storeURL path] даст вам этот путь (это относится к [storeURL lastPathComponent]:

..../Documents/1158a3c96ca22c41b8e731b1d1af0e1e

но если вы используете lastPathComponent на строку, как /var/mobile/Applications/DB92F4DC-49E4-4B4A-8271-6A9DAE6963BC/Documents/1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50, это даст вам 1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50

И это хорошо, так как в URL, '?' используется для параметров GET, но при смешивании со строкой могут возникнуть проблемы.

Для тех, кто читает это на Swift 5 days, я добился этого следующим образом:

      func doesFileExist(url: URL) -> Bool {
    let fileManager = FileManager.default
    return fileManager.fileExists(atPath: url.path)
}
Другие вопросы по тегам