ios - 无法在缓存目录中创建文件

标签 ios nsfilemanager

我正在尝试设置一个缓存目录以供在我的应用程序中使用,但由于我不知道的原因没有创建文件。我究竟做错了什么?以下是我正在使用的方法:

在类实用程序中:

+(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, isDir?@"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

最佳答案

如果目录不存在,则调用 NSFileManager fileExistsAtPath:isDirectory: 会为您提供一个不确定的 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, isDir?@"YES":@"NO");
}

您似乎还向路径添加了第二个文件夹 User_Image。您永远不会创建此目录。

我还建议您更改写入图像数据的方式。不使用 NSFileManager createFileAtPath:contents:attributes:,而是使用 NSData writeToFile:options:error:。然后您可以获得一个错误对象,提供任何问题的更多详细信息。

最后最好构建文件的完整路径。剥离最后一个路径部分(实际文件名),然后检查剩余路径是否存在。然后调用 createDirectoryAtPath... 并让它创建所有需要的文件夹。

关于ios - 无法在缓存目录中创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19081396/

相关文章:

ios - 集成和核心数据轻迁移

iphone - 在 View 导航时在 UITableView 中显示数据

swift - iOS9 FileManager 文件权限更改

ios - Swift 2.0 中的 NSFileManager fileExistsAtPath?

ios - 在 iCloud 中使用预先存在的 NSFileManager 代码

ios - 如何快速获取当前订阅的用户收据

ios - Objective C 正则表达式行以数字开头

ios - 如何在 UIsearchbar iOS swift 中为文本字段添加自定义图像

ios - 将音频文件下载到文件管理器中需要从本地路径播放它

ios - 如何使用 URLForDirectory 创建子目录?