Objective-c: как обрабатывать ошибки при загрузке простого текстового файла - PullRequest
0 голосов
/ 25 апреля 2011

Я пытаюсь загрузить просто TXT-файл в NSMutableArray.Мой файл называется NoteBook.txt.В следующих целях (обработка ошибок) я удалил NoteBook.txt, чтобы приложение фактически НЕ могло его загрузить.

В следующем коде я пытаюсь выяснить, существует ли файл в моей папке документов, которую яхотел бы загрузить.Следующий код на самом деле НЕ должен пытаться загрузить файл, поскольку его нет.Однако, тем не менее, это так, и мне интересно, что я делаю не так?

Представьте, что строка @ "NoteBook.txt" передается следующему методу и что такого файла нет в папке документовПриложение:

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

}

Спасибо за любые предложения, я очень признателен за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2011

Проблема в том, что вы проверяете, установлена ​​ли строка NSString, а не сам путь.

Что вам, вероятно, следует сделать, это проверить путь с помощью 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
}
1 голос
/ 25 апреля 2011

У вас уже есть код:

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

    }

Вы тестируете файл filePath, который на самом деле является просто строкой, которую вы создали. Вы не проверяете, есть ли за этим файл. Даже если

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

возвращает пустую строку, к которой вы все еще добавляете nameOfNoteBook, и, если поместить ее в оператор if, при проверке непустой строки будет получено значение true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...