NSFileManager无法创build文件

我有这个代码。 此代码不会在Document目录中创build一个文件,我不知道为什么。 任何人都可以看到我失踪。 “数据”字典有我所需要的,但是当涉及到writeToFile:它不会发生,因为没有创build文件。 在我的其他应用程序中也有相同的代码工作,我肯定错过了一些东西。

- (void)addBookmark{ NSFileManager *fileManager = [NSFileManager defaultManager]; if (![fileManager fileExistsAtPath: [self filePathOfBookmarks]]) { [self filePathOfBookmarks]; } NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: [self filePathOfBookmarks]]; if ([fileManager fileExistsAtPath: [self filePathOfBookmarks]]) { data = [[NSMutableDictionary alloc] initWithContentsOfFile: [self filePathOfBookmarks]]; } else { // If the file doesn't exist, create an empty dictionary data = [[NSMutableDictionary alloc] init]; } NSMutableDictionary *firstOne = [NSMutableDictionary dictionary]; [firstOne setObject:@"one" forKey:@"name"]; [firstOne setObject:@"two" forKey:@"call"]; [firstOne setObject:@"twoandhalf" forKey:@"email"]; [firstOne setObject:@"four" forKey:@"description"]; [data setObject:firstOne forKey:@"ID"]; [data writeToFile: [self filePathOfBookmarks] atomically:YES]; NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile: [self filePathOfBookmarks]]; NSLog(@"file content %@",savedStock); } - (NSString *) filePathOfBookmarks { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docDirectory = [paths objectAtIndex:0]; return [docDirectory stringByAppendingPathComponent:@"favourites"]; } 

 NSLog(@"%@",[self filePathOfBookmarks]); 

这返回:

/ Users / spire / Library / Application Support / iPhone Simulator / 5.1 / Applications / 40CAA37F-6477-4101-A142-D4797748ABD9 / Documents / Favorites

看到下面的代码,它从我身边完美的工作。 您刚刚提到filePathOfBookmarks方法中的目录不是确切的文件名。 我可以将数据保存在favourites.txt文件中。

你也可以参考下面的链接了解更多有关iOS文件处理的信息

1) 文件保存 – 加载/使用文件目录存储文件

2) iPhone文件系统

 - (void)addBookmark{ NSFileManager *fileManager = [NSFileManager defaultManager]; if (![fileManager fileExistsAtPath: [self filePathOfBookmarks]]) { [self filePathOfBookmarks]; } NSMutableDictionary *data;// = [[NSMutableDictionary alloc] initWithContentsOfFile: [self filePathOfBookmarks]]; if ([fileManager fileExistsAtPath: [self filePathOfBookmarks]]) { data = [[NSMutableDictionary alloc] initWithContentsOfFile: [self filePathOfBookmarks]]; } else { // If the file doesn't exist, create an empty dictionary data = [[NSMutableDictionary alloc] init]; } NSMutableDictionary *firstOne = [NSMutableDictionary dictionary]; [firstOne setObject:@"one" forKey:@"name"]; [firstOne setObject:@"two" forKey:@"call"]; [firstOne setObject:@"twoandhalf" forKey:@"email"]; [firstOne setObject:@"four" forKey:@"description"]; [data setObject:firstOne forKey:@"ID"]; [data writeToFile: [self filePathOfBookmarks] atomically:YES]; NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile: [self filePathOfBookmarks]]; NSLog(@"file content %@",savedStock); } - (NSString *) filePathOfBookmarks { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docDirectory = [paths objectAtIndex:0]; return [docDirectory stringByAppendingPathComponent:@"favourites.txt"]; } 

有些代码对我来说没有意义。

这不会做任何事情:

 if (![fileManager fileExistsAtPath: [self filePathOfBookmarks]]) { [self filePathOfBookmarks]; } 

然后你用你的书签文件内容初始化你的数据对象 – 但是在这一点上有可能文件不存在:

 NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: [self filePathOfBookmarks]]; 

您可以简单地省略上面的两个代码块,因为您之后再次检查:

 if ([fileManager fileExistsAtPath: [self filePathOfBookmarks]]) { data = [[NSMutableDictionary alloc] initWithContentsOfFile: [self filePathOfBookmarks]]; } else { // If the file doesn't exist, create an empty dictionary data = [[NSMutableDictionary alloc] init]; } 

这是有道理的。 但是,如果省略前两个代码块,请确保声明数据对象:

 NSMutableData *data; 

然后,将firstOne对象设置为数据字典。 这似乎很好(虽然使用此代码,从现有的书签文件加载的数据之前根本不使用)。

编写你的数据字典似乎也很好:

 [data writeToFile: [self filePathOfBookmarks] atomically:YES]; 

当然提供,你的方法filePathOfBookmarks返回一个有效的文件名。

该方法然而返回一个目录,而不是一个文件。 添加一个像这样的后缀:

 return [docDirectory stringByAppendingPathComponent:@"favorites.plist"]; 

使用检查文件path的有效性

 NSLog(@"%@",[self filePathOfBookmarks]); 

在写入文件之前。

也试试

 NSLog(@"%@",data); 

在写它之前看看你的字典包含了什么。

如果仍然无法正常工作,请重新发布。