从主包复制创建文件大小为零kb

时间:2011-11-21 17:17:42

标签: iphone nsbundle

作为我的应用启动的一部分,我将捆绑文件复制到我的文档目录。

这适用于我的四个文件中的三个,但第四个创建一个Zero KB文件。

在iOS 5.0 sim上运行。我已多次清理构建并检查文件名大写是否正确。

该文件出现在目录中,但是为零kb,应为24K

任何帮助表示感谢。

-(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]);
    }   
}

2 个答案:

答案 0 :(得分:0)

您是否还检查了原始文件大小?

尝试重置模拟器。来自NSFileManager文档:

  

如果dstPath上已存在同名文件,则此方法   中止复制尝试并返回适当的错误。

确保目的地为空,然后重试。另外,请检查error对象。

如果所有检查结果都是拼写文件名时出错。检查确切的文件是否存在于bundle,NSLog中,只要您使用文件名或路径等。您应该找到错误。同时检查Finder中的相应文件夹。

而不是使用

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

尝试

[[NSBundle mainBundle] pathForResource:shortName ofType:@"db"]

答案 1 :(得分:0)

好的,我弄明白是什么导致了这个问题。

当我运行应用程序时,appdidfinishlaunching方法在其中一个视图控制器加载之前未完成。该视图控制器尝试访问从包中复制的其中一个文件。

我猜测sqlite在您尝试访问数据库时会创建该文件,它会创建一个零字节长度的文件。

因此,当我的appdidfinish启动方法检查由于sql调用而存在的文件存在时。

这通常只会在第一次运行应用程序之前出现问题,因为数据库将存在。

问题现在是如何让appdidfinish启动完成之前剩下的允许启动,因为有问题的视图控制器是mainwindow.xib的一部分