开发者

Objective-c: How to handle errors when loading a simple txt file

I'm trying to load a simply TXT file into a NSMutableArray. My file is called NoteBook.txt. For the following purposes (handling errors), I deleted NoteBook.txt so that the App could actually NOT load it.

In the following code, I try to find out if the file exist in my Docs Folder which I'd like to load. The following code should actually NOT attempt to load the file as there isn't one. However, it does so nonetheless and I am wondering what I am doing wrong?

Imagine that the string @"NoteBook.txt" is passed to the following method and that there is no such file in the Docs Folder of the App:

 -(void) loadNoteBook:(NSString *)nameOfNoteBook
{

    NSLog(@"Starting method 'LoadNoteBook...'");

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents directory
    //NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"NoteBook.txt"];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:nameOfNoteBook];
    NSError *error;

    if (filePath) { // check if file exists - if so load it:
        NSLog(@"Loading notebook: %@", nameOfNoteBook);

        NSString *tempTextOut = [NSString stringWithContentsOfFile:filePath
                                                          encoding:NSUTF8StringEncoding
                                                             error:&error];

        self.NoteBook = [[[tempTextOut componentsSeparatedByString: @"\n*----------*\n"] mutableCopy] autorelease];
    }
    else
    {   
        // GENERATE mutable ARRAY

        NSLog(@"Loading notebook failed, creating empty one...");

        NoteBook = [[NSMutableArray alloc] init];

        for (int temp = 0; temp < 6; temp++) {
            [NoteBook insertObject:@"开发者_开发技巧Empty" atIndex:temp];
        }
    }

}

Thanks for any suggestions, I'd really appreciate your help.


The problem is that you're checking if the NSString is set, not the path itself.

What you should probably do is check the path with NSFileManager fileExistsAtPath:isDirectory:

BOOL isDir;

NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];
if ([fileManager fileExistsAtPath:filePath isDirectory:&isDir] && !isDir) {
    //file exists and is not a directory
}


You've got it already in your code:

    NSString *tempTextOut = [NSString stringWithContentsOfFile:filePath
                                                      encoding:NSUTF8StringEncoding
                                                         error:&error];

    if(!tempTextOut) {
        if(error) {
            // error specific code to execute
            NSLog(@"error loading file %@: %@", filePath, error);
        } 

        // GENERATE mutable ARRAY

        NSLog(@"Loading notebook failed, creating empty one...");

        NoteBook = [[NSMutableArray alloc] init];

        for (int temp = 0; temp < 6; temp++) {
            [NoteBook insertObject:@"Empty" atIndex:temp];
        }

    } else {
       self.NoteBook = [[[tempTextOut componentsSeparatedByString: @"\n*----------*\n"] mutableCopy] autorelease];

    }

You test on filePath, which is actually just a string you've created. You don't test if there is a file behind it. Even if

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

does return an empty string you still append nameOfNoteBook to it and will if put in an if statement, testing against a non empty string will evaluate to true.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜