Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSFileManager未保存数据_Ios_Objective C_Nsfilemanager - Fatal编程技术网

Ios NSFileManager未保存数据

Ios NSFileManager未保存数据,ios,objective-c,nsfilemanager,Ios,Objective C,Nsfilemanager,我试图将数据保存到由NSFileManager创建的目录中,但当我尝试检索数据并将其记录到NSLog中时,我得到了null。另外,当您创建目录时,是否意味着您在指定的url路径上创建了一个文件夹?这是我正在使用的代码 NSError *error = nil; NSFileManager *manager = [[NSFileManager alloc] init]; NSArray *urlsArray = [manager URLsForDirectory:NSDocumentDirecto

我试图将数据保存到由NSFileManager创建的目录中,但当我尝试检索数据并将其记录到NSLog中时,我得到了null。另外,当您创建目录时,是否意味着您在指定的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]);

您没有在目录中为映像指定文件名,可以通过在创建目录后立即添加此行来解决此问题:

// Right after the directory is created (I suppose the format is png) : url = [url URLByAppendingPathComponent:@"image.png"]; // Now you can continue with the rest of your code : //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]); //创建目录之后(我假设格式为png): url=[url URLByAppendingPathComponent:@“image.png”]; //现在,您可以继续执行其余代码: //获取照片图像的url,然后将其存储。 NSURL*imageURL=[FlickrFetcher urlForPhoto:self.recentPhoto格式:FlickpPhotoFormatLarge]; NSData*imageData=[[NSData alloc]initWithContentsOfURL:imageURL]; [imageData writeToURL:url原子:是]; //获取数据以检查其是否已存储 NSData*checkImageData=[[NSData alloc]initWithContentsOfURL:url]; //这将返回null NSLog(@“%@”,checkImageData); //这将返回0 NSLog(@“%d”,[manager isReadableFileAtPath:urlString]);
您没有在目录中为映像指定文件名,可以通过在创建目录后立即添加此行来解决此问题:

// Right after the directory is created (I suppose the format is png) : url = [url URLByAppendingPathComponent:@"image.png"]; // Now you can continue with the rest of your code : //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]); //创建目录之后(我假设格式为png): url=[url URLByAppendingPathComponent:@“image.png”]; //现在,您可以继续执行其余代码: //获取照片图像的url,然后将其存储。 NSURL*imageURL=[FlickrFetcher urlForPhoto:self.recentPhoto格式:FlickpPhotoFormatLarge]; NSData*imageData=[[NSData alloc]initWithContentsOfURL:imageURL]; [imageData writeToURL:url原子:是]; //获取数据以检查其是否已存储 NSData*checkImageData=[[NSData alloc]initWithContentsOfURL:url]; //这将返回null NSLog(@“%@”,checkImageData); //这将返回0 NSLog(@“%d”,[manager isReadableFileAtPath:urlString]);
我从未创建过文件管理器的实例。我总是简单地使用默认值。
看看这是否有帮助:

NSFileManager *manager = [NSFileManager defaultManager];                             

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

NSFileManager *manager = [NSFileManager defaultManager];                             

您的代码有几个问题

这:

应该是:

NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]];
NSString *urlString = [url path];
BOOL success = [manager createDirectoryAtURL:[url URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:&error];
NSError *error = nil;
BOOL res = [imageData writeToURL:url options:NSDataWritingAtomic error:&error];
if (!res) {
    NSLog(@"Unable to write to %@: %@", url, error);
}
这:

应该是:

NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]];
NSString *urlString = [url path];
BOOL success = [manager createDirectoryAtURL:[url URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:&error];
NSError *error = nil;
BOOL res = [imageData writeToURL:url options:NSDataWritingAtomic error:&error];
if (!res) {
    NSLog(@"Unable to write to %@: %@", url, error);
}
这:

应该是:

NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]];
NSString *urlString = [url path];
BOOL success = [manager createDirectoryAtURL:[url URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:&error];
NSError *error = nil;
BOOL res = [imageData writeToURL:url options:NSDataWritingAtomic error:&error];
if (!res) {
    NSLog(@"Unable to write to %@: %@", url, error);
}
这:

应该是:

NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]];
NSString *urlString = [url path];
BOOL success = [manager createDirectoryAtURL:[url URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:&error];
NSError *error = nil;
BOOL res = [imageData writeToURL:url options:NSDataWritingAtomic error:&error];
if (!res) {
    NSLog(@"Unable to write to %@: %@", url, error);
}

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

您的代码有几个问题

这:

应该是:

NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]];
NSString *urlString = [url path];
BOOL success = [manager createDirectoryAtURL:[url URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:&error];
NSError *error = nil;
BOOL res = [imageData writeToURL:url options:NSDataWritingAtomic error:&error];
if (!res) {
    NSLog(@"Unable to write to %@: %@", url, error);
}
这:

应该是:

NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]];
NSString *urlString = [url path];
BOOL success = [manager createDirectoryAtURL:[url URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:&error];
NSError *error = nil;
BOOL res = [imageData writeToURL:url options:NSDataWritingAtomic error:&error];
if (!res) {
    NSLog(@"Unable to write to %@: %@", url, error);
}
这:

应该是:

NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]];
NSString *urlString = [url path];
BOOL success = [manager createDirectoryAtURL:[url URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:&error];
NSError *error = nil;
BOOL res = [imageData writeToURL:url options:NSDataWritingAtomic error:&error];
if (!res) {
    NSLog(@"Unable to write to %@: %@", url, error);
}
这:

应该是:

NSURL *url = [[urlsArray lastObject] URLByAppendingPathComponent:[self.recentPhoto objectForKey:FLICKR_PHOTO_TITLE]];
NSString *urlString = [url path];
BOOL success = [manager createDirectoryAtURL:[url URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:&error];
NSError *error = nil;
BOOL res = [imageData writeToURL:url options:NSDataWritingAtomic error:&error];
if (!res) {
    NSLog(@"Unable to write to %@: %@", url, error);
}

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

我添加了此行,但当我尝试检索数据时仍然得到null?作为urlString(创建文件夹之前)您得到了什么?我添加了此行,但当我尝试检索数据时仍然得到null?作为urlString(创建文件夹之前)您得到了什么?尝试使用writeToURL:options:error:method写入NSData,然后查看是否返回错误--这可能有助于调试问题。我是否只记录错误?是的。每当有一个API提供了一个NSError out参数时,最好使用它并检查结果,这样您就可以理解它失败的原因。有关如何执行此操作的示例,请参见下面的答案之一。请尝试使用writeToURL:options:error:method写入NSData,并查看是否返回错误--这可能有助于调试问题。我是否只记录错误?是的。每当有一个API提供了一个NSError out参数时,最好使用它并检查结果,这样您就可以理解它失败的原因。有关如何执行此操作的示例,请参见下面的答案之一。+1关于
stringWithFormat:
。。。我在某个地方听说,Xcode的最新版本应该能够检测到这一点(其中
stringWithFormat:
@“%@”
作为格式字符串,只有一个字符串作为参数)。我的代码现在可以工作了,谢谢,但有一些问题,我不会使用带有绝对字符串的urlString,所以这仍然是一个问题吗?使用absoluteString而不是path有什么错?此外,目录是否与文件相似?我只是对目录
path
将文件URL转换为路径有点困惑
absoluteString
只给出URL的字符串表示形式(类似于“file:///somepath/to/the/file"). 文件是实际的内容。目录(或文件夹)是文件的集合。+1关于
stringWithFormat:
。。。我在某个地方听说,Xcode的最新版本应该能够检测到这一点(其中
stringWithFormat:
@“%@”
作为格式字符串,只有一个字符串作为参数)。我的代码现在可以工作了,谢谢,但有一些问题,我不会使用带有绝对字符串的urlString,所以这仍然是一个问题吗?使用absoluteString而不是path有什么错?此外,目录是否与文件相似?我只是对目录
path
将文件URL转换为路径有点困惑<代码>绝对字符串只给出一个字符串