ios writeToFile更改不保存

时间:2012-05-20 05:28:35

标签: iphone ios ios5

ios声称文件已写入,但更改从未实际保存,就好像它们保留在缓冲区中一样。我需要冲洗还是什么?

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *myFilePath = [[NSBundle mainBundle]
                            pathForResource:@"MyFile"
                            ofType:@"txt"];

    NSLog(@"\n\nPath = \n%@", myFilePath);

    NSString *myFileContents = [NSString stringWithContentsOfFile:myFilePath
                                    encoding:NSUTF8StringEncoding
                                    error:nil];


    NSLog(@"\n\nContents = \n%@", myFileContents);

    [@"This line will be written to file" writeToFile:myFilePath
        atomically:YES encoding:NSUTF8StringEncoding error:nil];

    NSString *changedContents = [NSString stringWithContentsOfFile:myFilePath
                                    encoding:NSUTF8StringEncoding
                                    error:nil];

    NSLog(@"\n\nChanged Contents = \n%@", changedContents);
}

输出:

Path = 
/Users/hamzeh/Library/Application Support/iPhone Simulator/5.1/Applications/2B318687-A745-4CD9-85BA-52A01AB76F6E/savepersistentdata_tutorial.app/MyFile.txt

Contents = 
This is a text file.
The file will be displayed on the iPhone.
That is all for now. 

Changed Contents = 
This line will be written to file

这是我每次运行时得到的输出,因此更改实际上不会写入文件。

感谢您的帮助。

3 个答案:

答案 0 :(得分:7)

您无法编辑主包中的文件。您必须先将文件保存到应用程序文档文件夹,然后进行任何更改。

以下是一些可能解决您问题的代码:

首先将文本保存到您创建的目录中:

NSString *myFilePath = [[NSBundle mainBundle]
                            pathForResource:@"MyFile"
                            ofType:@"txt"];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *directory = [NSString stringWithFormat:@"%@/Some_Directory", [paths objectAtIndex:0]];

// Check if the directory already exists
if (![[NSFileManager defaultManager] fileExistsAtPath:directory]) {
    // Directory does not exist so create it
    [[NSFileManager defaultManager] createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:nil];
} 

NSData *data = [[NSData dataWithContentsOfFile:myFilePath] retain];

NSString *filePath = [[directory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", [myFilePath lastPathComponent]]] retain];



NSError *error = nil;
if (![data writeToFile:filePath options:NSDataWritingFileProtectionNone error:&error]) {
    [data writeToFile:filePath atomically:NO];
}
[data release];
[filePath release];

答案 1 :(得分:0)

使用NO参数

[@"This line will be written to file" writeToFile:myFilePath atomically:NO encoding:NSUTF8StringEncoding error:nil];

iOS文档说

(BOOL)useAuxiliaryFile
如果是,则将接收器写入辅助文件,然后将辅助文件重命名为路径。如果为NO,则将接收器直接写入路径。 YES选项保证路径(如果存在的话)即使系统在写入期间崩溃也不会被破坏。

答案 2 :(得分:0)

您无法在主捆绑包上写入文件,因为资源捆绑包是只读的。您还可以检查writeToFile方法的返回。如果将其部署在设备上,则返回false。