简体   繁体   中英

Not able to write into text file

I need to write a string into a file. For that, my code is:

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

I am calling this method like this

ownServices *obj = [[ownServices alloc]init];
[obj writeToFile:@"iphone.txt" :@"this is mahesh babu"];

but it didn't write into the text file.

What's the reason? Can anyone please help me.

Thank u in advance.

The most likely problem is that the documents directory does not exist. Create it if it doesn't, then write to it:

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

Even simpler would be to use the latest API, which will create the directory for you if it doesn't already exist:

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

Firstly, you are calling your method strangely. Rename the method to

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

and call it like so:

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

Secondly, writeToFile:atomically: is deprecated, use writeToFile:atomically:encoding:error: :

NSError *error = nil;
BOOL success = [data writeToFile:appFile  atomically:YES encoding:NSUTF8Encoding error:&error];
if (!success) {
    NSLog(@"Error: %@", [error userInfo]);
}

This way, you also see what the error is.

Your code looks OK. Use the debugger (or an NSLog statement) to verify the values of data and appFile . If data is nil , nothing will happen (including no errors) because sending a message to nil is a no-op. It's also possible that appFile is not the path you think it is.

Check the permissions of the directory you are trying to write to ( ls -la ). On the device you can't, but on the simulator you can. Is it read-only for you? Is it owned by another user?

Assuming that isn't the problem, try calling with atomically:NO . Atomic file writing is performed by writing a file, then renaming it to replace the old one. If the problem is there, that will isolate the problem.

Bonus Style Critique

  • Class names should start with an uppercase letter: OwnServices instead of ownServices
  • Although your method name is perfectly valid, it's unusual to have two parameters with no words to separate them. A name like writeToFile:string: would be better.
  • Don't name a variable data if it is meant to point to an instance of something other than NSData . It's confusing, and there's almost a better (more specific) word you can use beside "data".

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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