使用[NSBundle mainBundle]写入文件失败

Abh*_*nav 15 file-io cocoa-touch objective-c ios

我试图从一个文件中取出内容并将其写入另一个文件.我读得很好,但我无法将其写入另一个文件.

我有一个单词数据库.我想根据字母数将单词分成不同的文件.所有四个字母单词都放在一个文件中,依此类推.我在我的资源中添加了一个名为"4letter"的txt文件,以下是我的代码:

NSError *error;

//READ
NSString *dbFile = [[NSBundle mainBundle] pathForResource:@"words" ofType:@"txt"];
NSString *test = [NSString stringWithContentsOfFile:dbFile encoding:NSUTF8StringEncoding error:&error];

//convert from string to array
NSArray *lines = [test componentsSeparatedByString:@"\n"]; 

NSFileHandle *logFile = nil;
logFile = [NSFileHandle fileHandleForWritingAtPath:[[NSBundle mainBundle] pathForResource:@"4letter" ofType:@"txt"]];

//Test if write works
for (int i=0; i<5; i++) 
{
    NSString *randomAnagram = [[lines objectAtIndex:i] lowercaseString];
    [logFile writeData: [randomAnagram dataUsingEncoding: NSNEXTSTEPStringEncoding]];
}
Run Code Online (Sandbox Code Playgroud)

Cal*_*leb 22

在iOS中,您无法在应用程序包中写入文件 - 整个包是只读的.请改用Documents文件夹中的路径.

  • 请参阅[标准系统目录](http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/LowLevelFileMgmt/Articles/StandardDirectories.html#//apple_ref/doc/uid/20001279-SW4)以了解如何找到Documents目录以及其他标准目录. (4认同)

Dan*_*eel 8

有关更好的说明,请参阅特殊的文件系统编程指南.
在iOS中,您无法在应用程序包中写入文件 - 整个包是只读的.

在iCloud备份的上下文中,考虑阅读iOS数据存储指南以更好地理解下面目录的用途.

<APPLICATION_HOME> /AppName.app

这是包含应用程序本身的包目录.不要在此目录中写任何内容.为防止篡改,bundle目录在安装时签名.写入此目录会更改签名并阻止您的应用再次启动.


<APPLICATION_HOME> /文档/

使用此目录存储关键用户文档和应用程序数据文件.关键数据是您的应用无法重新创建的任何数据,例如用户生成的内容.该目录的内容可以通过文件共享提供给用户.该目录的内容由iTunes备份.


<APPLICATION_HOME> /库/

此目录是非用户数据文件的文件的顶级目录.您通常将文件放在几个标准子目录之一中,但您也可以为要备份但未向用户公开的文件创建自定义子目录.您不应将此目录用于用户数据文件.该目录的内容(Caches子目录除外)由iTunes备份.有关Library目录的其他信息,请参阅"Library Directory存储特定于应用程序的文件".

请参阅iOS标准目录中的完整列表(tmp /,Documents/Inbox):文件所在的位置

更新
我使用NSFileManager方法URLForDirectory:inDomain:appropriateForURL:create:error:


ios*_*eak 7

像Caleb说的那样,你不能写入应用程序的目录,但是你可以写入应用程序的Documents文件夹.你可以这样得到它:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
Run Code Online (Sandbox Code Playgroud)


HiT*_*GYs 6

您的应用程序包是只读的。有两种方式我可以看到:

1) 在文档文件夹中写入:

NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path =  [myPathList  objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

2)使用sqlite数据库。这与 1 相同(无论如何您必须将 db 保存在文档中),但是您使用的是 sqlite 数据库。我认为这比很多 txt 和 plist 文件要好:这里有一个关于该主题的教程