使用[NSBundle mainBundle]写文件失败

17

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

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

26

在iOS系统中,你无法将内容写入到应用程序包内的文件中,因为整个应用程序包都是只读的。建议使用Documents文件夹下的路径来进行操作。


1
文档文件夹的路径是什么?我的目标是iOS系统。写入后,我在哪里可以找到这个文件夹? - Abhinav
4
请查看标准系统目录,了解如何定位文档目录以及其他标准目录。 - Caleb
1
要获取文档文件夹的路径,请使用以下代码: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentsDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; - OscarVGG
1
即使您可以写入捆绑包,该捆绑包也没有备份,您的应用程序数据将会丢失。 - BergQuester
@python 那为什么不创建一个问题并提出问题呢?这与此问题不同,在任何情况下,答案可能需要比评论允许的空间更多。考虑到这一点,如果您能删除此处的先前评论-减少混乱,那将是很好的。谢谢。 - Caleb
显示剩余3条评论

10

查看专有的文件系统编程指南以更好地理解。

在iOS中,您无法将文件写入应用程序包中--整个包都是只读的。

请考虑阅读iOS数据存储指南,以更好地了解下面目录的目的,与iCloud备份的上下文相关。

<Application_Home>/AppName.app

这是包含应用程序本身的捆绑目录。不要向此目录写入任何内容。为了防止篡改,捆绑目录在安装时已签名。写入此目录会更改签名,防止应用程序再次启动。


<Application_Home>/Documents/

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


<Application_Home>/Library/

此目录是非用户数据文件的顶级目录。您通常可以将文件放在几个标准子目录之一,但也可以为希望备份而不暴露给用户的文件创建自定义子目录。您不应将此目录用于用户数据文件。此目录的内容(除了Caches子目录)由iTunes备份。有关Library目录的其他信息,请参阅“Library目录存储特定于应用程序的文件”。

请参考 iOS标准目录:文件存储位置,查看完整列表(tmp /,Documents / Inbox)。
更新:
我使用NSFileManager方法URLForDirectory:inDomain:appropriateForURL:create:error:

我仔细阅读了整篇文档。但我有疑惑,如果我将非常重要的文件或视频保存在文档文件夹中,那么其他人是否能够轻松地获取到这些文件呢? - python
1
你不能像这样共享文件,因为每个文件只能从你的应用程序中可见。要共享文档,您需要文件交互编程指南 - DanSkeel

8

就像Caleb所说的那样,你不能将数据写入应用程序的目录,但是你可以将数据写入应用程序的文档文件夹。你可以通过以下方式获取它:

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

6
您好,以下是您需要翻译的内容:

您的应用程序包是只读的。有两种方法:

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

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

2) 使用sqlite数据库。这与1相同(您必须在文档中保存数据库),但是您正在使用sqlite数据库。我认为这比许多txt和plist文件更好:这里有一个关于此主题的教程


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);

2
你的代码与问题中的代码有何不同之处?问题中的代码为什么会失败,而你的代码如何避免这个问题? - Peter Hosey
2
不同之处在于我将文件定位到应用程序的“文档”目录中,这样我就可以访问并写入它。而问题中的代码使用的是应用程序包,该包是只读的。 - Kostas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接