iOS: копирование файла из пакета при запуске приложения

Когда пользователь впервые использует мое приложение, он должен скопировать файл конфигурации из пакета в какую-то папку. Затем пользователь может возиться с этим файлом, и если он испортит его, он может просто нажать «восстановить», что удалит файл и снова скопирует его из пакета.

- (void) resetPresets
{
    LOG_( @"Copying tunings file from original..." );

    // copy default tunings -> curr tunings file

    NSString* appSupportDir = [NSFileManager appSupportDir];
    NSString* tuningsPath = [appSupportDir stringByAppendingPathComponent: @"tunings.txt"];

    NSBundle* bundle = [NSBundle mainBundle];
    NSString* origTuningsPath = [bundle pathForResource: @"tuningsOriginal"
                                                 ofType: @"txt" ];


    NSFileManager* fileManager = [NSFileManager defaultManager];
    NSError* error = nil;

    if( [fileManager fileExistsAtPath: tuningsPath] )
    {
        [fileManager removeItemAtPath: tuningsPath
                                error: & error ];
        if( error ) 
            LOG( @"\n ERROR: %@ \n %@ \n", [error userInfo], [error localizedFailureReason] );
    }


    assert( [fileManager fileExistsAtPath: origTuningsPath] );

    [fileManager copyItemAtPath: origTuningsPath
                         toPath: tuningsPath
                          error: & error ];

    if( error ) 
        LOG( @"\n ERROR: %@ \n %@ \n", [error userInfo], [error localizedFailureReason] );


    LOG( @"done!" );


    // load profiles from it
    [self loadProfilesFromFile: tuningsPath ];

    // auto-sets active preset index to 0 & saves prefs
    self.activeThemeIndex = 0;
}

опирается на простую категорию:

#import "NSFileManager+addons.h"


@implementation NSFileManager ( NSFileManager_addons )

+ (NSString *) appSupportDir
{

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

    NSString* appSupportDir = [paths objectAtIndex: 0];

    return appSupportDir;
}

@end

это строка, вызывающая проблему:

    [fileManager copyItemAtPath: origTuningsPath
                         toPath: tuningsPath
                          error: & error ];

и это вывод консоли:

[presets init] Пресеты -> первый запуск! Настройка с пресетами по умолчанию Копирование файла настроек из оригинала... ОШИБКА: { NSDestinationFilePath = "/var/mobile/Applications/38FC3C65-74AF-4892-B48D-A3508A8CF404/Library/Application Support/tunings.txt"; NSFilePath = "/var/mobile/Applications/38FC3C65-74AF-4892-B48D-A3508A8CF404/Fork.app/tuningsOriginal.txt"; NSUserStringVariant = Копировать; } Данный файл или каталог отсутствует

Почему он жалуется, что нет такого файла или каталога? Очевидно, что такого файла не должно быть. когда вы копируете файл в новое место, вы не ожидаете, что файл там будет.

поэтому я предполагаю, что он жалуется на каталог. Но я выловил каталог, используя довольно стандартный метод. что происходит? Это не тот каталог, который нужно использовать? Или я делаю что-то еще не так?


person P i    schedule 21.07.2011    source источник


Ответы (1)


Не гарантируется, что каталоги, возвращаемые NSSearchPathForDirectoriesInDomains, существуют; вам нужно создать их самостоятельно, если это необходимо (см. apple_ref/doc/uid/20000055-SW5" rel="nofollow">документацию). createDirectoryAtPath:withIntermediateDirectories:attributes:error: может помочь в этом.

person Anomie    schedule 21.07.2011