好吧,我遇到了一个问题,几天来我一直在努力。这是:当尝试使用writeToFile写入xml文件(放置在我正在开发的xcode项目中)时,写入不起作用,我在xml文件中看不到任何内容,尽管从writeToFile返回的bool值是正在评估为真!此外,文件字节为零。所以,如果有人能帮助我,我真的很感激。下面是我写的代码的一部分:
//writing to a file
NSString *pathOfFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"xml"];
NSString *dummyString = @"Hello World!!\n";
NSFileManager *filemanager;
filemanager = [NSFileManager defaultManager];
//entering the first condition so I assured that the file do exists
if ([filemanager fileExistsAtPath:pathOfFile] == YES)
NSLog (@"File do exist !!!");
else
NSLog (@"File not found !!!");
BOOL writingStatus = [dummyString writeToFile:path atomically:YES encoding:NSUnicodeStringEncoding error:nil];
//Not entering this condition so I am assuming that writing process is successful but when I open the file I can't find the string hello world and file size shows 0 bytes
if(!writingStatus)
{
NSLog(@"Error: Could not write to the file");
}
我也试过这个替代方案,但遗憾的是它也没有用。
NSString *hello_world = @"Hello World!!\n";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex:0];
NSString *fileName = @"sample.xml";
NSString *filePath = [directory stringByAppendingPathComponent:fileName];
NSLog(@"%@",filePath);
BOOL sucess = [hello_world writeToFile:filePath atomically:YES encoding:NSASCIIStringEncoding error:nil];
if(!sucess)
{
NSLog(@"Could not to write to the file");
}
答案 0 :(得分:3)
在第一段代码中,我们看不到path
的定义。如果这是一个拼写错误并且您的意思是file_path
,则问题是file_path
指向应用程序包内的路径。您无法在应用包内写字。 (不应该有任何拼写错误,因为你应该直接粘贴代码。)
在第二种情况下,很难说出问题所在。 filePath
应该位于可写的文档目录中。但是,如果您遇到实际错误,诊断问题会容易得多。不要在nil
中传递-writeToFile:atomically:encoding:error:
错误参数,而是创建一个NSError*
变量并传入其地址。如果出现问题,那么,您的指针将设置为指向描述问题的NSError对象。
答案 1 :(得分:3)
writeToFile:
返回布尔值为YES的事实只是意味着呼叫正在完成。
您应该将NSError**
传递给writeToFile:
并进行检查,例如:
NSError *error = nil;
BOOL ok = [hello_world writeToFile:filePath atomically:YES
encoding:NSASCIIStringEncoding error:&error];
if (error) {
NSLog(@"Fail: %@", [error localizedDescription]);
}
这应该能给你一个关于出错的好线索(假设在通话后错误不是零)。
答案 2 :(得分:0)
-(void)test{
//writing to a file
NSError *error;
NSString *pathOfFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@".xml"];//was missing '.'
NSString *dummyString = @"Hello World!!\n";
NSFileManager *filemanager;
filemanager = [NSFileManager defaultManager];
//entering the first condition so I assured that the file do exists
//the file exists in the bundle where you cannot edit it
if ([filemanager fileExistsAtPath:pathOfFile]){
NSLog (@"File do exist IN Bundle MUST be copied to editable location!!!");
NSArray *locs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [[locs objectAtIndex:0]stringByAppendingString:@"dummyFile"];
NSString *file = [docsDir stringByAppendingPathComponent:@".xml"];
[filemanager copyItemAtPath:pathOfFile toPath:file error:&error];
}
else{
NSLog (@"File not found in bundle!!!");
}
if (error) {
NSLog(@"error somewhere");
}
//if youre only messing with strings you might be better off using .plist file idk
BOOL success = [dummyString writeToFile:file atomically:YES encoding:NSUnicodeStringEncoding error:nil];
//Not entering this condition so I am assuming that writing process is successful but when I open the file I can't find the string hello world and file size shows 0 bytes
if(!success)
{
NSLog(@"Error: Could not write to the file");
}
}
答案 3 :(得分:0)
//I typically do something like this
//lazy instantiate a property I want such as array.
-(NSMutableArray*)array{
if (!_array) {
_array = [[NSMutableArray alloc]initWithContentsOfFile:self.savePath];
}
return _array;
}
//I'm using a class to access anything in the array from as a property from any other class
//without using NSUserDefaults.
//initializing the class
-(instancetype)init{
self = [super init];
if (self) {
//creating an instance of NSError for error handling if need be.
NSError *error;
//build an array of locations using the NSSearchPath...
NSArray *locs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//location 0 of array is Documents Directory which is where I want to create the file
NSString *docsDir = [locs objectAtIndex:0];
//my path is now just a matter of adding the file name to the docsDir
NSString *path = [docsDir stringByAppendingPathComponent:@"fileName.plist"];
//if the file is a plist I have in my bundle I need to copy it to the docsDir to edit it
//I'll do that by getting it from the bundle that xCode made for me
NSString *bunPath = [[NSBundle mainBundle]pathForResource:@"fileName" ofType:@".plist"];
//now I need a NSFileManager to handle the dirty work
NSFileManager *filemngr = [NSFileManager defaultManager];
//if the file isn't in my docsDir I can't edit so I check and if need be copy it.
if (![filemngr fileExistsAtPath:path]) {
[filemngr copyItemAtPath:bunPath toPath:path error:&error];
//if an error occurs I might want to do something about it or just log it as in below.
//I believe you can set error to nil above also if you have no intentions of dealing with it.
if (error) {
NSLog(@"%@",[error description]);
error = nil;
}
//here I'm logging the paths just so you can see in the console what's going on while building or debugging.
NSLog(@"copied file from %@ to %@",bunPath,path);
}
//in this case I'm assigning the array at the root of my plist for easy access
_array = [[NSMutableArray alloc]initWithContentsOfFile:path];
_savePath = path;//this is in my public api as well for easy access.
}
return self;
}