NSData datawithcontentsoffile возвращает ноль

у меня есть код ниже для получения файла из каталога документов iphone:

NSString *docsDir;
NSString *realpath;
NSArray *dirPaths;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];

realpath=[[NSString alloc] initWithString:
          [docsDir stringByAppendingPathComponent: @"2_program.db"]];
NSFileManager *filemgr = [NSFileManager defaultManager];
if ([filemgr fileExistsAtPath: realpath ] == YES)
{
    NSLog(@"find file");
    NSData *uploadedData=[NSData dataWithContentsOfFile:realpath];
    NSString * uploadedDataBase64= [NSString base64forData:uploadedData];
    NSLog(@"base64: %@",uploadedDataBase64);
}
else
{
    NSLog(@"not found");
}

файловый менеджер находит файл, но nsdata возвращает null, однако оба они имеют один и тот же путь

размер моего файла около 60кб

есть идеи, почему это могло произойти? я что-то упустил?


person ercan    schedule 02.06.2014    source источник
comment
Используйте dataWithContentsOfFile:options:error: для получения информации о причине сбоя.   -  person Martin R    schedule 02.06.2014
comment
Какой путь к файлу? У него есть схема file:// или нет?   -  person David Rönnqvist    schedule 02.06.2014
comment
Ваш uploadedData возвращает результат или только ваш uploadedDataBase64 возвращает ноль?   -  person Pancho    schedule 02.06.2014
comment
проблема в методе base64forData   -  person Suryakant Sharma    schedule 02.06.2014
comment
я проверяю параметры wig: ошибка и ошибка равна нулю. Также проверьте загруженные данные, и он возвращает только ‹›   -  person ercan    schedule 02.06.2014
comment
@ercan: Это означает, что файл существует и пуст.   -  person Martin R    schedule 02.06.2014
comment
извините, это может быть пустым, мое имя базы данных для запроса отличается. ок проверю файл db   -  person ercan    schedule 02.06.2014


Ответы (3)


Попробуйте эту замечательную категорию NSData+Base64 от Мэтта Галлахера вместе с приведенным ниже кодом.

    NSString *realpath=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent: @"2_program.db"];
if ([[NSFileManager defaultManager] fileExistsAtPath:realpath]){
    NSLog(@"find file");
    NSData *uploadedData=[NSData dataWithContentsOfFile:realpath];
    NSString *uploadedDataBase64=[[[NSString alloc]initWithData:uploadedData encoding:NSUTF8StringEncoding] base64EncodedString];
    NSLog(@"base64: %@",uploadedDataBase64);
}
else{
    NSLog(@"not found");
}
person Sadiq Jaffer    schedule 02.06.2014

код, который вы написали здесь, выглядит нормально, я бы посоветовал вам выбрать другой метод, который также требует экземпляра NSError.

               `dataWithContentsOfFile:options:error:`

Поскольку вы попытаетесь преобразовать содержимое этого файла в NSData, если что-то пойдет не так, вы все равно получите некоторое описание ошибки, и это описание ошибки может вам помочь.

Я надеюсь, что это может быть полезно для вас ...... развеселить

person Kamar Shad    schedule 02.06.2014

realpath=[[NSString alloc] initWithString:
      [docsDir stringByAppendingPathComponent: @"2_program.db"]];

здесь вы пропустили / измените приведенное выше утверждение на

realpath = [[NSString alloc] initWithString:
      [docsDir stringByAppendingPathComponent: @"/2_program.db"]];
person sreekanthk    schedule 02.06.2014
comment
-stringByAppendingPathComponent: автоматически вставляет разделитель пути. - person JeremyP; 02.06.2014
comment
Ознакомьтесь с документацией по method: Возвращаемое значение Новая строка, созданная путем добавления aString к получателю, при необходимости предшествующая разделителю пути. - person JeremyP; 02.06.2014
comment
Таким образом, он добавит разделитель. - person JeremyP; 02.06.2014
comment
@JeremyP разве ты не видел таблицу примеров в предоставленной тобой ссылке. / есть в каждом примере - person sreekanthk; 03.06.2014
comment
Верхняя строка таблицы — это пример [@"/tmp" stringByAppendingPathComponent: @"scratch.tiff"], а ответ, который вы получите, — @“/tmp/scratch.tiff”. Обратите внимание, как метод сам добавил разделитель пути. - person JeremyP; 07.06.2014