2015-09-27 6 views
0

У меня есть приложение, работающее в симуляторе XCode (v6.4); это уместный код:writeToFile с ошибкой = null

  NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

     // read the file back into databuffer... 
     NSFileHandle *readFile = [NSFileHandle fileHandleForReadingAtPath:[documentsPath stringByAppendingPathComponent: @"Backup.txt"]]; 
     NSData *databuffer = [readFile readDataToEndOfFile]; 
     [readFile closeFile]; 

     // compress the file 
     NSData *compressedData = [databuffer gzippedData] ; 

     // Write to disk 
     NSString *outputPath = [NSString stringWithFormat:@"%@/%@%@.zip", documentsPath, venueName, strDate]; 
     _BackupFilename = fileName; // save for upload 

     NSFileHandle *outputFile = [NSFileHandle fileHandleForWritingAtPath:outputPath]; 
     NSError *error = nil; 

     // write the data for the backup file 
     BOOL success = [compressedData writeToFile: outputPath options: NSDataWritingAtomic error: &error]; 

     if (error == nil && success == YES) { 
      NSLog(@"Success at: %@",outputPath); 
     } 
     else { 
      NSLog(@"Failed to store. Error: %@",error); 
     } 

     [outputFile closeFile]; 

Я пытаюсь создать резервную копию файла, приняв файл, сжимая его, а затем писать его. Я получаю ошибку Не удалось сохранить. Ошибка: (null)); почему он терпит неудачу, не возвращая код ошибки?

+0

Hi Rick ... выходной файл используется как вход в функцию «восстановления» ... Я сделаю изменения и вернусь к вам ... ПРИМЕЧАНИЕ: Я только что сохранил свой комментарий и теперь ВСЕ у вас нет? Как мне вернуть их? – SpokaneDude

ответ

2

Здесь не так много вещей. Начать. изменить if заявление:

if (success) { 

Никогда не явно сравнивать значение BOOL для YES или NO.

Вы также никогда не используете outputFile, поэтому удалите этот код. Это может помешать вызову writeToFile:.

И нет смысла использовать дескриптор файла для чтения данных. Просто используйте NSData dataWithContentsOfFile:.

И не строите пути, используя stringWithFormat:.

В целом, я бы написать свой код, как:

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

// read the file back into databuffer... 
NSString *dataPath = [documentsPath stringByAppendingPathComponent:@"Backup.txt"]]; 
NSData *databuffer = [NSData dataWithContentsOfFile:dataPath]; 

// compress the file 
NSData *compressedData = [databuffer gzippedData]; 

// Write to disk 
NSString *outputName = [NSString stringWithFormat:@"%@%@.zip", venueName, strDate]; 
NSString *outputPath = [documentsPath stringByAppendingPathComponent:outputName]; 

// write the data for the backup file 
NSError *error = nil; 
BOOL success = [compressedData writeToFile:outputPath options:NSDataWritingAtomic error:&error]; 

if (success) { 
    NSLog(@"Success at: %@",outputPath); 
} else { 
    NSLog(@"Failed to store. Error: %@",error); 
} 

С success еще NO и error еще nil, то, скорее всего, это означает, что compressedData является nil. Вероятно, это означает, что databuffer - nil, что означает, что в папке Documents нет файла с именем Backup.txt (дело имеет значение).

+0

С помощью вашего кода я получаю то же самое (ошибка: Ошибка: (null)) – SpokaneDude

+0

Тогда, скорее всего, 'compressData' - это' nil', что может означать, что 'databuffer' -' nil', что означает, что нет файла с именем 'Backup.txt' в папке' Documents'. – rmaddy

+0

Спасибо, Рик ... Я последую за этим ...: D – SpokaneDude