- [NSString writeToFile:]不会更改文件的内容

时间:2011-09-09 01:50:46

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

我正在尝试写入我的资源中的“index.html”文件。我可以毫无问题地加载文件,但我似乎无法写入它。没有任何东西显示为错误,它只是不写。该应用程序不会中止或任何东西,但当我重新加载文件时没有任何改变。

我的写作代码:

NSBundle *thisBundle = [NSBundle bundleForClass:[self class]];
NSString *path = [thisBundle pathForResource:@"index" ofType:@"html"];
NSString *myString = [[NSString alloc] initWithFormat:@""];
[myString writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:NULL];

我的加载代码:

[myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]isDirectory:NO]]];

我做错了什么?

2 个答案:

答案 0 :(得分:9)

现有代码不会覆盖index.html文件的原因是应用程序无法覆盖其资源。 Apple的iOS Application Programming Guide具体说:

  

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

而是写入您的文档目录。您可以像这样获取文档目录的路径:

NSString * docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

请注意,iOS上的NSHomeDirectory()简单地返回应用程序包的路径。获得文档目录的路径后,您可以写入资源,比如index.html,如下所示:

NSString * path = [docsDir stringByAppendingPathComponent:@"index.html"];
[myString writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];

请注意,我已将error:参数更改为nil。这实际上不会影响任何事情,但通常的做法是使用nil来指示NULL Objective-C对象。

答案 1 :(得分:1)

尝试将文件移动到Documents Directory,然后再执行这一系列代码的操作

·H

#import <Foundation/Foundation.h>

@interface NSFileManager (NSFileManagerAdds)
+ (NSString*) copyResourceFileToDocuments:(NSString*)fileName withExt:(NSString*)fileExt;
@end

的.m

#import "NSFileManager + NSFileManagerAdds.h"

@implementation NSFileManager (NSFileManagerAdds)

+ (NSString*) copyResourceFileToDocuments:(NSString*)fileName withExt:(NSString*)fileExt
{
    //Look at documents for existing file
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", fileName, fileExt]];

    NSFileManager* fileManager = [NSFileManager defaultManager];

    if(![fileManager fileExistsAtPath:path])
    {
        NSError *nError;
        [fileManager copyItemAtPath:[[NSBundle mainBundle] pathForResource:fileName ofType:fileExt] toPath:path error:&nError];
    }

    return path;
}

@end

最后你应该在类似的东西中使用它:

[NSFileManager copyResourceFileToDocuments:@"index" withExt:@"html"];