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

时间:2011-05-02 02:28:00

标签: objective-c cocoa-touch ios file-io

我正在尝试从一个文件中获取内容并将其写入另一个文件。我读得很好,但我无法将其写入另一个文件。

我有一个单词数据库。我想根据字母数将单词分成不同的文件。所有四个字母单词都放在一个文件中,依此类推。我在我的资源中添加了一个名为“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]];
}

5 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:8)

有关更好的说明,请参阅特殊File System Programming Guide 在iOS中,您无法在应用程序包中写入文件 - 整个包是只读的。

在iCloud备份的上下文中,考虑阅读iOS Data Storage Guidelines以更好地理解以下目录的用途。

<强>&LT; APPLICATION_HOME&GT; /AppName.app

  

这是包含应用程序本身的包目录。别写了   这个目录的任何东西。为了防止篡改,捆绑目录   在安装时签署。写入此目录会更改   签名并阻止您的应用再次启动。


<强>&LT; APPLICATION_HOME&GT; /文档/

  

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


<强>&LT; APPLICATION_HOME&GT; /库/

  

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

请参阅iOS Standard Directories: Where Files Reside

中的完整列表(tmp /,Documents / Inbox)

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

答案 2 :(得分:7)

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

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

答案 3 :(得分:4)

您的应用套装是只读的。我可以通过两种方式看到:

1)写入文件夹:

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

2)使用sqlite数据库。这和1相同(你必须在文档中保存db),但是你使用的是sqlite数据库。我认为这比许多txt和plist文件更好:here's a tutorial on the topic

答案 4 :(得分:2)

我使用以下代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"set.txt"];

NSString *data=@"Kostas";

[data writeToFile:appFile atomically:YES];   

NSString *myData = [NSString stringWithContentsOfFile:appFile];   

NSLog(@"Data : %@ ",myData);