无法写入文本文件

时间:2011-06-06 12:56:21

标签: iphone objective-c ios

我需要在文件中写一个字符串。为此,我的代码是:

-(void)writeToFile:(NSString *)fileName: (NSString *)data {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    // the path to write file
    NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName];
    [data writeToFile:appFile atomically:YES];  
}

我这样称呼这个方法

ownServices *obj = [[ownServices alloc]init];
[obj writeToFile:@"iphone.txt" :@"this is mahesh babu"];

但它没有写入文本文件。

是什么原因?任何人都可以帮助我。

提前感谢你。

3 个答案:

答案 0 :(得分:3)

最可能的问题是文档目录不存在。如果没有,则创建它,然后写入:

NSArray *paths = NSSearchPathForDirectoriesInDomains(
        NSDocumentDirectory, NSUserDomainMask, YES);
NSString *parentDir = [paths objectAtIndex:0];

/* Create the parent directory.
 * This is expected to fail if the directory already exists. */
(void)[[NSFileManager defaultManager]
       createDirectoryAtPath:parentDir
       withIntermediateDirectories:YES
       attributes:nil error:NULL];
NSString *path = [parentDir stringByAppendingPathComponent:fileName];

/* Now write, and if it fails, you'll know why thanks to the |error| arg. */
NSError *error = nil;
BOOL ok = [data writeToFile:path options:NSDataWritingAtomic error:&error];
if (!ok) {
    NSLog(@"%s: Failed to write to %@: %@", __func__, path, error);
}

更简单的方法是使用最新的API,如果它尚不存在,它将为您创建目录:

NSError *error = nil;
NSURL *parentURL = [[NSFileManager defaultManager]
    URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask
    appropriateForURL:nil create:YES error:&error];
if (!parentURL) {
    NSLog(@"%s: *** Failed to get documents directory: %@", __func__, error):
    return;
}

NSURL *furl = [parentURL URLByAppendingPathComponent:fileName];
error = nil;
BOOL ok = [data writeToURL:furl options:NSDataWritingAtomic error:&error];
if (!ok) {
    NSLog(@"%s: *** Failed to write to %@: %@", __func__, furl, error);
}

答案 1 :(得分:2)

首先,你正在奇怪地调用你的方法。将方法重命名为

-(void)writeString:(NSString *) data toFile:(NSString *)fileName

并称之为:

[obj writeString:@"this is mahesh babu" toFile:@"iphone.txt"];

其次,writeToFile:atomically:已弃用,请使用writeToFile:atomically:encoding:error:

NSError *error = nil;
BOOL success = [data writeToFile:appFile  atomically:YES encoding:NSUTF8Encoding error:&error];
if (!success) {
    NSLog(@"Error: %@", [error userInfo]);
}

这样,你也可以看到错误是什么。

答案 2 :(得分:2)

您的代码看起来不错。使用调试器(或NSLog语句)验证dataappFile的值。如果datanil,则不会发生任何事情(包括没有错误),因为向nil发送消息是无操作的。 appFile也可能不是您认为的路径。

检查您尝试写入的目录的权限(ls -la)。在设备上你不能,但在模拟器上你可以。它是只读给你的吗?它是否归其他用户所有?

假设不是问题,请尝试使用atomically:NO进行调用。通过编写文件来执行原子文件写入,然后重命名以替换旧文件。如果问题存在,那将解决问题。

奖金风格评论

  • 类名称应以大写字母开头:OwnServices而不是ownServices
  • 虽然您的方法名称完全有效,但是有两个参数没有单词来分隔它们是很常见的。像writeToFile:string:这样的名字会更好。
  • 如果要将变量data指向NSData以外的其他实例,请不要将其命名。令人困惑的是,你可以在“数据”旁边使用几乎更好(更具体)的词。