2013-09-29 2 views
4

Я пытаюсь настроить каталог кэшей для использования в моем приложении, но файлы не создаются по неизвестной мне причине. Что я делаю не так? Вот методы я использую:Не удается создать файлы в каталоге кешей

В классе Utilities:

+(NSString *)imageCachePath { 
    NSString *cacheDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *pieceImagesDirectory = [cacheDirectory stringByAppendingPathComponent:@"PieceImages"]; 
    NSLog(@"imageCachPath is %@",pieceImagesDirectory); 
    return pieceImagesDirectory; 
} 
+ (void)cacheImage:(UIImage *)image usingName:(NSString *)name; 
{ 
    NSLog(@"Caching image %@",name); 
    NSString *pieceImagesDirectory = [self imageCachePath]; 
    BOOL isDir = NO; 
    NSError *error; 
    if (! [[NSFileManager defaultManager] fileExistsAtPath:pieceImagesDirectory isDirectory:&isDir] && isDir == NO) { 
     [[NSFileManager defaultManager]createDirectoryAtPath:pieceImagesDirectory withIntermediateDirectories:YES attributes:nil error:&error]; 
     NSLog(@"Error after creating directory:\n%@",error); 
    } else { 
     // file exists - I don't expect to use the else block. This is for figuring out what's going on. 
     NSLog(@"File %@ exists -- is it a directory? %@",pieceImagesDirectory, [email protected]"YES":@"NO"); 
    } 
    NSString *nameToUseInFilename = [name stringByReplacingOccurrencesOfString:@" " withString:@"_"]; 
    NSString *fullPath = [pieceImagesDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",nameToUseInFilename]]; 
    NSData *data = UIImagePNGRepresentation(image); 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    //Save the file, overwrite existing if exists. 
    NSLog(@"Attempting to create file at path %@ with %d bytes of data",fullPath, [data length]); 
    if ([fileManager createFileAtPath:fullPath contents:data attributes:nil]) { 
     NSLog(@"Success"); 
    } else { 
     NSLog(@"Error creating file"); 
    } 
} 

В классе, где создаются образы, я вызываю метод, таким образом:

// image is an object of type UIImage 
// cachedImageName is a string that resolves to something like User Image/12 
[Utilities cacheImage:image usingName:cachedImageName]; 

Вот пример NSLog вывода строки в отладчике:

... Caching image User Image/12 
... imageCachPath is /var/mobile/Applications/5EBB1152-5CC1-4A30-ABD5-B4C9A60E4CB4/Library/Caches/PieceImages 
... File /var/mobile/Applications/5EBB1152-5CC1-4A30-ABD5-B4C9A60E4CB4/Library/Caches/PieceImages exists -- is it a directory? YES 
... Attempting to create file at path /var/mobile/Applications/5EBB1152-5CC1-4A30-ABD5-B4C9A60E4CB4/Library/Caches/PieceImages/User_Image/12.png with 12071 bytes of data 
... Error creating file 
+1

Вы подтвердили, что 'PieceImages' существует и является каталогом, но также вы подтвердили, что' User_Image' существует и является каталогом? – jlehr

ответ

7

вызов NSFileManager fileExistsAtPath:isDirectory: дает вам неопределенную ва lue для isDir, если каталог не существует. Вы должны изменить свой код:

BOOL isDir = NO; 
NSError *error; 
if (! [[NSFileManager defaultManager] fileExistsAtPath:pieceImagesDirectory isDirectory:&isDir]) { 
    [[NSFileManager defaultManager]createDirectoryAtPath:pieceImagesDirectory withIntermediateDirectories:YES attributes:nil error:&error]; 
    NSLog(@"Error after creating directory:\n%@",error); 
} else { 
    // file exists - I don't expect to use the else block. This is for figuring out what's going on. 
    NSLog(@"File %@ exists -- is it a directory? %@",pieceImagesDirectory, [email protected]"YES":@"NO"); 
} 

также, что вы добавляете вторую папку User_Image в путь. Вы никогда не создадите этот каталог.

Я также предлагаю вам изменить способ записи данных изображения. Вместо использования NSFileManager createFileAtPath:contents:attributes: используйте NSData writeToFile:options:error:. Затем вы можете получить объект ошибки, предоставляющий более подробную информацию о любой проблеме.

В конце концов, может быть лучше всего создать полный путь к файлу. Удалите последний компонент пути (фактическое имя файла), а затем проверьте наличие оставшегося пути. Затем сделайте один звонок createDirectoryAtPath... и позвольте ему создать все все необходимые папки.

+0

Вы правы в этом UserImage. По какой-то причине у меня было это на мой взгляд, что сIntermediateDirectories: YES применялось к нему, но, конечно, оно относится только к создаваемому в данный момент директории. Держу пари, вот в чем проблема. Я проверю NSData writeToFile: options: error :. Я никогда раньше этого не использовал. Благодарю. –

+0

Да. Переключение с/на. в имени файла разрешена проблема - не то, что я хочу пойти с этой структурой, но она подтверждает, что проблема не была создана в каталоге. –

+0

Спасибо большое ... – byJeevan

Смежные вопросы