Проверьте, существует ли файл в 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, и я не нашел подходящей задачи, подходящей для моей цели.
Любые подсказки?
Ответы
Ответ 1
if (![fileManager fileExistsAtPath:[storeURL path]])
...
Из documentation:
Если этот URL-адрес содержит URL-адрес файла (как определено с помощью isFileURL) возвращаемое значение этого метода подходит для ввода в методы NSFileManager или NSPathUtilities. Если путь имеет завершающую косую черту, лишается.
Ответ 2
Для файловой системы URL NSURL
сам имеет метод проверки доступности URL
NSError *error;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
if ([storeURL checkResourceIsReachableAndReturnError:&error]) {
// do something
} else {
NSLog(@"%@", error);
}
Ответ 3
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, но если вы смешаетесь со строкой, у вас могут быть проблемы.