NSFileManager 不保存数据

Posted

技术标签:

【中文标题】NSFileManager 不保存数据【英文标题】:NSFileManager not saving Data 【发布时间】:2013-07-11 23:41:43 【问题描述】:

我正在尝试将数据保存到由 NSFileManager 创建的目录中,但是当我尝试检索数据和 NSLog 时,我得到空值。另外,当您创建目录时,这是否意味着您在指定的 url 路径上创建了一个文件夹?这是我正在使用的代码

NSError *error = nil;
NSFileManager *manager = [[NSFileManager alloc] init];
NSArray *urlsArray = [manager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSLog(@"%@", urlsArray);
// This will create a new url and append a photo title to the end
NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@", [self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]]];
NSLog(@"%@", url);
NSString *urlString = [NSString stringWithFormat:@"%@", [url absoluteString]];
NSLog(@"%@", urlString);
//create the directory
if(![manager fileExistsAtPath:urlString isDirectory:YES])
    BOOL success = [manager createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:&error];
    if (!success) 
        NSLog(@"Error creating data path: %@", [error localizedDescription]);
    

//get url for a photo image and then store it.
NSURL *imageURL = [FlickrFetcher urlForPhoto:self.recentPhoto format:FlickrPhotoFormatLarge];
NSData *imageData = [[NSData alloc] initWithContentsOfURL:imageURL];
[imageData writeToURL:url atomically:YES];
//get data to check if its stored
NSData *checkImageData = [[NSData alloc] initWithContentsOfURL:url];
//This returns null
NSLog(@"%@", checkImageData);
//this returns 0
NSLog(@"%d", [manager isReadableFileAtPath:urlString]);

【问题讨论】:

尝试使用 writeToURL:options:error: 方法写入 NSData 并查看是否返回错误 - 这可能有助于您调试问题。 那我是不是要 nslog 错误呢? 是的。每当有提供 NSError 输出参数的 API 时,最好使用它并检查结果,以便了解它失败的原因。有关如何执行此操作的示例,请参阅以下答案之一。 【参考方案1】:

您的代码有几个问题。

这个:

NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@", [self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]]];

应该是:

NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]];

这个:

NSString *urlString = [NSString stringWithFormat:@"%@", [url absoluteString]];

应该是:

NSString *urlString = [url path];

这个:

BOOL success = [manager createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:&error];

应该是:

BOOL success = [manager createDirectoryAtURL:[url URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:&error];

这个:

[imageData writeToURL:url atomically:YES];

应该是:

NSError *error = nil;
BOOL res = [imageData writeToURL:url options:NSDataWritingAtomic error:&error];
if (!res) 
    NSLog(@"Unable to write to %@: %@", url, error);

主要问题是使用absoluteString 而不是path 将URL 转换为文件路径。创建目录时,次要传递的是文件名而不是路径。不必要地使用stringWithFormat: 并没有造成任何问题,但现在请改掉这个习惯。仅当您实际需要格式化字符串时才使用stringWithFormat:。不需要将字符串分配给字符串变量。

【讨论】:

+1 about stringWithFormat:... 我在某处听说最近版本的 Xcode 应该能够处理这个问题(其中 stringWithFormat: 被指定为 @"%@" 作为格式字符串和只有一个字符串作为参数)。 我的代码现在可以工作了,谢谢,但只是一些问题,我最终没有使用具有 absoluteString 的 urlString,所以这仍然是一个问题吗?使用 absoluteString 而不是路径有什么问题?另外,目录是否类似于文件?我只是对目录有点困惑 path 将文件 URL 转换为路径。 absoluteString 只是给出 URL 的字符串表示形式(类似于“file:///somepath/to/the/file”)。文件是实际内容。目录(或文件夹)是文件的集合。【参考方案2】:

您没有为目录中的图像指定文件名,这可以通过在目录创建后添加此行来解决:

// 在目录创建之后(我想格式是 png): url = [url URLByAppendingPathComponent:@"image.png"]; // 现在您可以继续执行其余代码: //获取照片图像的url,然后存储它。 NSURL *imageURL = [FlickrFetcher urlForPhoto:self.recentPhoto 格式:FlickrPhotoFormatLarge]; NSData *imageData = [[NSData alloc] initWithContentsOfURL:imageURL]; [imageData writeToURL:url atomically:YES]; //获取数据以检查其是否存储 NSData *checkImageData = [[NSData alloc] initWithContentsOfURL:url]; //这返回null NSLog(@"%@", checkImageData); //这返回0 NSLog(@"%d", [manager isReadableFileAtPath:urlString]);

【讨论】:

我添加了这一行,但当我尝试检索数据时仍然为空? 你得到了什么作为 urlString(在创建文件夹之前)?【参考方案3】:

我从未创建过文件管理器的实例。我一直只是简单地使用默认值。 看看这是否有帮助:

NSFileManager *manager = [NSFileManager defaultManager];                             

【讨论】:

以上是关于NSFileManager 不保存数据的主要内容,如果未能解决你的问题,请参考以下文章

NSFileManager 不保存

我如何保存在 NSFileManager 中?

NSFileManager&&NSFileHandle

在 Swift 中创建文件夹

如果文件存在,不要保存到文件 NSFileManager

归档和解档配合NSFile存储数据