繁体   English   中英

无法写入文本文件

[英]Not able to write into text file

我需要将字符串写入文件。 为此,我的代码是:

-(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"];

但它没有写入文本文件。

什么原因? 谁能帮帮我吗。

提前谢谢你。

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

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);
}

首先,您奇怪地调用了您的方法。 将方法重命名为

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

并这样称呼它:

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

其次,不推荐使用 writeToFile:atomically 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]);
}

这样,您还可以看到错误是什么。

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

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

假设这不是问题,请尝试使用atomically:NO调用。 原子文件写入是通过写入一个文件,然后将其重命名以替换旧文件来执行的。 如果问题存在,那将隔离问题。

奖金风格评论

  • Class 名称应以大写字母开头: OwnServices而不是ownServices
  • 尽管您的方法名称完全有效,但很少有两个参数没有单词来分隔它们。 writeToFile:string:这样的名称会更好。
  • 如果变量data旨在指向NSData以外的某个实例,请不要命名它。 这很令人困惑,除了“数据”之外,您几乎可以使用一个更好(更具体)的词。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM