iPhone, если файл существует проблема - PullRequest
0 голосов
/ 22 сентября 2011

Из всех примеров, которые я видел, я верю, что все делаю правильно. Вот мой код:

NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
NSUserDomainMask, YES) objectAtIndex:0];
NSString* thisImage = [documentsPath stringByAppendingPathComponent:image_path];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:thisImage];

if (fileExists){
    hotel_image = [UIImage imageNamed:image_path];
}else{
    hotel_image = [UIImage imageNamed:@"hdrHotels.jpg"];
}

Вы можете предположить, что "image_path" равно "images / hotels / thishotel.jpg".

Теперь сначала, чтобы все поняли, «hdrHotels.jpg» находится в базовом каталоге. И "images / hotels / thishotel.jpg" являются актуальными подкаталогами (голубые фоллеры). Я также пытался использовать:

NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *imagePath = [NSString stringWithFormat:@"/%@",image_path];
NSString* thisImage = [documentsPath stringByAppendingPathComponent:imagePath];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:thisImage];

Добавление перед "/" перед "images / hotels / thishotel.jpg". То, что происходит в обоих этих случаях, заключается в том, что утверждение «если» ложно, существует изображение или нет. Я не уверен, что я делаю не так вообще. Любая помощь будет принята с благодарностью.

EDIT:

Я изменил:

NSString *imagePath = [NSString stringWithFormat:@"/%@",image_path];

до:

NSString *imagePath = [image_path stringByReplacingOccurrencesOfString:@"images/hotels/" withString:@""];

Но это все равно не сработало.

Я тоже пробовал:

NSFileManager* fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString* documentsDir = [paths objectAtIndex:0];
NSString* myFilePath = [NSString stringWithFormat:@"%@/%@", documentsDir, image_path];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:myFilePath];

без удачи.

---------------------------------- ОТВЕТ ------------ --------------------

Так что да, я наконец понял это. Я не могу ответить на свой вопрос, так как у меня еще нет 100 повторений, но вот исправление.

NSFileManager* fileManager = [NSFileManager defaultManager];
NSString *myFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:image_path];

BOOL fileExists = [fileManager fileExistsAtPath:myFilePath];

if (fileExists){
    hotel_image = [UIImage imageNamed:image_path];
}else{
    hotel_image = [UIImage imageNamed:@"hdrHotels.jpg"];
}

Ответы [ 4 ]

0 голосов
/ 09 декабря 2013

Теперь, когда я вижу это снова, я наконец могу ответить на него:

NSFileManager* fileManager = [NSFileManager defaultManager];
NSString *myFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:image_path];

BOOL fileExists = [fileManager fileExistsAtPath:myFilePath];

if (fileExists){
    hotel_image = [UIImage imageNamed:image_path];
}else{
    hotel_image = [UIImage imageNamed:@"hdrHotels.jpg"];
}
0 голосов
/ 22 сентября 2011

Добавление начального / к image_path и последующее добавление его к documentPath приводит к «docDir // imagePath», файловая система обрабатывает это как «docDir / imagePath». Как предложил viggio24, сначала найдите ваши изображения в resourceDir, а затем в docDir.

0 голосов
/ 22 сентября 2011

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

// Temporary Path Folder (read/write files)
//
NSMutableString *tempPathFile = [[NSMutableString alloc] initWithCapacity:(NSUInteger)1024];
[tempPathFile setString:[NSTemporaryDirectory() stringByAppendingPathComponent:@"export.mov"]];


// Application Folder (read-only files)
//
NSString *systemDirectoryPath = [[NSString alloc] initWithString:[[NSBundle mainBundle] resourcePath]];


// Documents Folder (read/write files)
//
NSArray *filePaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [[NSString alloc] initWithString:[filePaths objectAtIndex:0]];


// Another way to access Documents Folder (read/write files)
//
NSMutableString *documentsPath = [[NSMutableString alloc] initWithCapacity:(NSUInteger)1024];
[documentsPath setString:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]];

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

0 голосов
/ 22 сентября 2011

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

...