我需要在文件中写一个字符串。为此,我的代码是:
-(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"];
但它没有写入文本文件。
是什么原因?任何人都可以帮助我。
提前感谢你。
答案 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
语句)验证data
和appFile
的值。如果data
为nil
,则不会发生任何事情(包括没有错误),因为向nil
发送消息是无操作的。 appFile
也可能不是您认为的路径。
检查您尝试写入的目录的权限(ls -la
)。在设备上你不能,但在模拟器上你可以。它是只读给你的吗?它是否归其他用户所有?
假设不是问题,请尝试使用atomically:NO
进行调用。通过编写文件来执行原子文件写入,然后重命名以替换旧文件。如果问题存在,那将解决问题。
OwnServices
而不是ownServices
writeToFile:string:
这样的名字会更好。data
指向NSData
以外的其他实例,请不要将其命名。令人困惑的是,你可以在“数据”旁边使用几乎更好(更具体)的词。