File write with [NSBundle mainBundle] fails

2019-01-01 05:49发布

I am trying to take content from one file and write it into another. I am reading fine, but I am not able to write it into another file.

I have a database of words. I want to separate the words into different files based on the number of letters. All four letter words go into one file, and so on. I added a txt file called "4letter" into my resources and the following is my code:

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条回答
刘海飞了
2楼-- · 2019-01-01 06:20

In iOS, you can't write into a file in your app's bundle -- the entire bundle is read-only. Use a path into the Documents folder instead.

查看更多
其实,你不懂
3楼-- · 2019-01-01 06:26

I use the following code :

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);
查看更多
萌妹纸的霸气范
4楼-- · 2019-01-01 06:28

Like Caleb said, you can't write to your app's directory, but you can write to your app's Documents folder. You can get it like this:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
查看更多
听够珍惜
5楼-- · 2019-01-01 06:31

Your app's bundle is read-only. There is two ways I could see:

1) Write in documents folder:

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

2) Use sqlite database. This is the same as 1 (you must save db in documents anyway), but you're using sqlite database. I think this is better than a lot of txt and plist files: here's a tutorial on the topic.

查看更多
皆成旧梦
6楼-- · 2019-01-01 06:45

See special File System Programming Guide for better understnading.
In iOS, you can't write into a file in your app's bundle -- the entire bundle is read-only.

Consider reading iOS Data Storage Guidelines to better understand the purpose of directories below, in context of iCloud backup.

<Application_Home>/AppName.app

This is the bundle directory containing the app itself. Do not write anything to this directory. To prevent tampering, the bundle directory is signed at installation time. Writing to this directory changes the signature and prevents your app from launching again.


<Application_Home>/Documents/

Use this directory to store critical user documents and app data files. Critical data is any data that cannot be recreated by your app, such as user-generated content. The contents of this directory can be made available to the user through file sharing. The contents of this directory are backed up by iTunes.


<Application_Home>/Library/

This directory is the top-level directory for files that are not user data files. You typically put files in one of several standard subdirectories but you can also create custom subdirectories for files you want backed up but not exposed to the user. You should not use this directory for user data files. The contents of this directory (with the exception of the Caches subdirectory) are backed up by iTunes. For additional information about the Library directory, see “The Library Directory Stores App-Specific Files.”

See full list (tmp/, Documents/Inbox) in iOS Standard Directories: Where Files Reside

UPDATE
I use NSFileManager method URLForDirectory:inDomain:appropriateForURL:create:error:

查看更多
登录 后发表回答