writeToFile is not writing to the file
Well I am experiencing a problem and I've been struggling with it for few days. Here it is: when trying to write to an xml file (placed in the xcode project which I am developing) using writeToFile, writing doesn't work and I can see nothing in the xml file although the bool value which is returned from writeToFile is being evaluated to true !! In addition, the file bytes are zero. So, I would really appreciate if anyone can help me out with that. Below is part of the code which I wrote:
//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 successfu开发者_JAVA技巧l 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");
}
I also tried this alternative, but unfortunately it didn't work too.
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");
}
In the first piece of code, we can't see the definition of path
. If that's a typo and you meant file_path
, the problem is that file_path
points to a path inside the app bundle. You can't write inside your app bundle. (There shouldn't be any typos, because you should be pasting the code directly.)
In the second case, it's harder to tell what the problem is. filePath
should be in the documents directory, which is writeable. However, it'd be a lot easier to diagnose the problem if you were getting an actual error. Instead of passing nil
for the error parameter in -writeToFile:atomically:encoding:error:
, create a NSError*
variable and pass in its address. If there's a problem, then, your pointer will be set to point to an NSError object that describes the problem.
The fact that writeToFile:
is returning a boolean value of YES simply means that the call is completing.
You should be passing an NSError**
to writeToFile:
and examining that, e.g:
NSError *error = nil;
BOOL ok = [hello_world writeToFile:filePath atomically:YES
encoding:NSASCIIStringEncoding error:&error];
if (error) {
NSLog(@"Fail: %@", [error localizedDescription]);
}
That should give you a good clue about what is going wrong (assuming error is not nil after the call).
-(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");
}
}
//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;
}
精彩评论