копирование из основного пакета создает файл размером 0 КБ

В рамках запуска моего приложения я копирую файлы пакетов в каталог документов.

Это отлично работает для трех из четырех моих файлов, но четвертый создает файл Zero KB.

работает на iOS 5.0 sim. Я несколько раз очищал сборку и проверял правильность использования заглавных букв в имени файла.

файл появляется в каталоге, но имеет нулевой размер КБ и должен быть 24 КБ

любая помощь приветствуется.

-(BOOL) CheckDBs: (NSString *)dbname 
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];   
    NSString *dbPath = [documentsDir stringByAppendingPathComponent:dbname];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL success = [fileManager fileExistsAtPath: dbPath];
    NSLog(@"AppDelegate CheckDatabase: %@ = %i", dbPath, success);

    if (success) {
        //NSLog(@"return YES");
        return YES;
    }
    else {
        return NO;  
    }   
}  // Complete - checks if files exist in the User Documents directory

-(void) copyDBs: (NSString *) dbname 
{
    //Using NSFileManager we can perform many file system operations.
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    NSString *dbPath = [documentsDir stringByAppendingPathComponent:dbname];        
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbname];
    BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

    if (success) {

        // Version 4.0 code
        //NSDictionary *attribs = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];
        //success = [fileManager setAttributes:attribs ofItemAtPath:dbPath error:&error];
        NSLog(@"AppDelegate copyDatase: %@ = %d", dbPath, success); 
    }

    //NSLog(@"AppDelegate copyDatase: %@ = %d", dbPath, success);   
    if (!success) {

        NSLog(@"Failed to copy database: '%@'", [error localizedDescription]);
        //  NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }   
}

person MB.    schedule 21.11.2011    source источник
comment
Включите рассматриваемый код, чтобы мы могли увидеть, что вы делаете неправильно.   -  person WrightsCS    schedule 21.11.2011
comment
включенный код одна вещь, которую журнал дает мне 1 (то есть, что файл существует в местоположении пути. я вызываю приведенный выше код следующим образом dbname = @UserProfile.db; if (![self CheckDBs:dbname]) { // проверяем, чтобы посмотреть, существует ли User.db в каталоге Documents [self copyDBs:dbname];//скопировать связанную БД }   -  person MB.    schedule 21.11.2011


Ответы (2)


Вы также проверили исходный размер файла?

Попробуйте перезагрузить симулятор. Из документации NSFileManager:

Если файл с таким именем уже существует в dstPath, этот метод прерывает попытку копирования и возвращает соответствующую ошибку.

Убедитесь, что пункт назначения пуст, и повторите попытку. Также проверьте объект error.

Если все сходится, значит, в написании имени файла есть ошибка. Проверьте, существует ли точный файл в пакете, NSLog, где бы вы ни использовали имя файла или путь, и т. д. Вы должны найти ошибку. Также проверьте соответствующую папку в Finder.

Вместо использования

[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbname]

пытаться

[[NSBundle mainBundle] pathForResource:shortName ofType:@"db"]
person Mundi    schedule 21.11.2011
comment
да, когда я выбираю показать содержимое пакета против пакета в поисковике, он показывает, что ресурс составляет 24 КБ. затем, когда я проверяю папку документов, файл отображается с нулевым КБ. - person MB.; 21.11.2011
comment
Никакой радости... сброс сима ничего не изменил - person MB.; 21.11.2011
comment
Я не получаю ошибку. Что я получаю, так это возврат 1 из метода checkDBs, даже если файл не существует. - person MB.; 21.11.2011
comment
есть 4 файла, с которыми я справляюсь, это файл номер 3, а все остальные копируются нормально. Если я вручную копирую из пакета в каталог документов, он работает нормально - person MB.; 21.11.2011
comment
Хорошо, мне интересно, это потому, что имя файла больше 8 символов.... Я собираюсь проверить это и посмотреть - person MB.; 23.11.2011

Хорошо, я понял, в чем причина проблемы.

когда я запускаю приложение, метод appdidfinishlaunching не завершается до загрузки одного из контроллеров представления. Этот контроллер представления пытается получить доступ к одному из файлов, копируемых из пакета.

Я предполагаю, что sqlite создает файл, когда вы пытаетесь получить доступ к базе данных, он создает его с нулевой длиной байтов.

Поэтому, когда мой метод запуска appdidfinish проверяет наличие файла, он существует из-за вызова sql.

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

теперь проблема заключается в том, как я могу завершить запуск appdidfinish до того, как остальные будут разрешены для запуска, поскольку рассматриваемый контроллер представления является частью mainwindow.xib

person MB.    schedule 23.11.2011
comment
хорошо, я переместил метод первого запуска до добавления tabbarcontroller, и он завершается до запуска методов загрузки viewcontroller... - person MB.; 23.11.2011