2011-05-02 50 views
14

我试图从一个文件获取内容并将其写入另一个文件。我读得很好,但我无法将它写入另一个文件。使用[NSBundle mainBundle]写入文件失败

我有一个单词数据库。我想根据字母数字将单词分成不同的文件。所有四个字母单词都归入一个文件,依此类推。我增加了一个叫做“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]]; 
} 

回答

22

在iOS中,也可以不写到您的应用程序的包文件 - 将整捆为只读。改为在“文档”文件夹中使用路径。

+1

什么是文档文件夹的路径?我的目标是iOS。写入它后,我可以在哪里找到文件夹? – Abhinav 2011-05-02 02:41:29

+4

请参阅[标准系统目录(http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/LowLevelFileMgmt/Articles/StandardDirectories.html#//apple_ref/doc/uid/20001279-SW4)学习如何查找Documents目录以及其他标准目录。 – Caleb 2011-05-02 02:49:16

+1

要获取的文件夹使用的路径: 的NSArray *路径= NSSearchPathForDirectoriesInDomains(NSDocumentsDirectory,NSUserDomainMask,YES); NSString * documentsDirectory = [paths objectAtIndex:0]; – OscarVGG 2013-02-03 16:18:10

4

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

1)写的文档文件夹中:

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

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

+0

非常感谢。让我看看我能否得到这个工作。 – Abhinav 2011-05-02 04:24:24

7

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

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

更好understnading见特殊File System Programming Guide
在iOS中,无法写入应用程序包中的文件 - 整个包是只读的。

考虑阅读iOS Data Storage Guidelines以更好地理解iCloud备份环境下目录的用途。

< APPLICATION_HOME> /AppName.app

这是包含应用本身束目录。不要将 任何内容写入此目录。为防止篡改,捆绑软件目录 在安装时被签名。写入此目录将更改 签名并阻止您的应用再次启动。


< APPLICATION_HOME> /文档/

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


< APPLICATION_HOME> /库/

此目录是不属于用户 数据文件文件的顶级目录。通常,您可以把文件的几个标准 子目录之一,但你也可以为你 想要备份而不暴露给用户的文件创建自定义的子目录。这个目录不应该使用 用户数据文件。这个目录 (与缓存子目录除外)的内容通过 的iTunes备份。有关Library目录的更多信息,请参见 “图书馆目录存储应用程序特定的文件。”

iOS Standard Directories: Where Files Reside

UPDATE
我完整列表(TMP /,文件/收件箱)使用的NSFileManager方法URLForDirectory:inDomain:appropriateForURL:create:error:

+0

我甚至读过这个完整的文档。我有困惑,如果我保存我的文件夹中的非常imp文件或视频。然后它会轻松地提供给其他人。 – python 2014-02-25 13:53:28

+1

您不能共享这样的文件,因为每个文件只能从您的应用程序中看到。要共享您需要的文档['文档交互编程Guide'(https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/DocumentInteraction_TopicsForIOS/Introduction/Introduction.html#//apple_ref/doc/uid/ TP40010403) – DanSkeel 2014-02-26 10:33:55

2

我使用以下代码:

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

NSString *[email protected]"Kostas"; 

[data writeToFile:appFile atomically:YES]; 

NSString *myData = [NSString stringWithContentsOfFile:appFile]; 

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

这与问题中的代码有什么不同?为什么问题中的代码失败,以及代码如何避免这个问题? – 2013-02-10 01:37:21

+2

不同的是,我找到我的文件到应用程序的Documents目录,在那里我可以写入它。问题中的代码使用只读的应用程序包。 – Kostas 2013-02-10 17:03:10

相关问题