writeToFile没有写入文件

时间:2011-10-03 13:31:45

标签: objective-c ios

好吧,我遇到了一个问题,几天来我一直在努力。这是:当尝试使用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");
}

4 个答案:

答案 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;
}