2016-05-24 3 views
1

В настоящее время я использую следующий код для записи NSData во вложенной папке папки документов.NSData: writeToFile возвращающая ошибка «Файл не существует»

NSData* dataToSave=...; 
NSFileManager* fileManager = [NSFileManager defaultManager]; 
NSString* documentsDir=[ 
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
    objectAtIndex:0]; 
NSString* desiredFolder=[documentsDir stringByAppendingPathComponent:@"MySubfolder"]; 
BOOL isDir; 

if (![fileManager fileExistsAtPath:desiredFolder isDirectory:&isDir]&&!isDir) 
{ 
    NSError* error; 
    [fileManager createDirectoryAtPath:desiredFolder 
     withIntermediateDirectories:NO attributes:nil error:&error]; 
    if (error) { 
     NSLog(@"Error%@", error.localizedDescription); 
    } 
}  
NSString* desiredFile=[desiredFolder stringByAppendingPathComponent:@"mfile.jpeg"]; 
if (![dataToSave writeToFile:desiredFile options:NSDataWritingAtomic error:&error]) 
{ 
    NSLog(@"Error %@",error.localizedDescription); 
    return NO; 
} 

Он работал до тех пор, пока я не протестировал эту конфигурацию в «режиме выпуска». Там NSData: writeToFile начал возвращать NO, с ошибкой: The file 'myfile.jpeg´ doesn't exist.

Где проблема?

Thanks

+2

Вы имеете в виду '' /mfile.jpeg "' not myfile.jpeg? –

+0

также, когда вы используете строку appendString, вы должны использовать '@"/"', но вы используете 'stringByAppendingPathComponent' pass fileName, а не косую черту –

+0

Это была ошибка в расшифровке, я использую версию без '/', также обновил вопрос – Addev

ответ

1

Благодаря @mbi я нашел ответ.

Проблема заключается в том, когда проверка наличия родительской папки:

if (![fileManager fileExistsAtPath:desiredFolder isDirectory:&isDir]&&!isDir) 

Это неправильно. Поскольку параметр isDirectory небезопасен, isDir может быть правдой, даже если результатом метода является NO. Таким образом, правильный способ оценить просто:

if (![fileManager fileExistsAtPath:desiredFolder isDirectory:nil]) 

Или, если вы хотите, чтобы обрабатывать случай, когда файл существует, но не является каталогом:

if (![fileManager fileExistsAtPath:desiredFolder isDirectory:&isDir]){ 
... 
}else if(!isDir) { 
... 
} 
+0

Я думаю, что это правильно, однако я не согласен что 'isDir' может быть' YES', когда метод возвращает 'NO'. Это не имеет никакого смысла предполагать, что вы инициализируете 'isDir'' NO'. Необязательный файл также не может быть каталогом. – trojanfoe

0

Попробуйте этот метод.

if (![dataToSave writeToFile:desiredFile atomically:YES]) 
{ 
    NSLog(@"Error writing to file : %@",desiredFile); 
    return NO; 
} 
Смежные вопросы