无法将文件从包复制到 Documents 目录,为啥 fileExistsAtPath 返回错误?

Posted

技术标签:

【中文标题】无法将文件从包复制到 Documents 目录,为啥 fileExistsAtPath 返回错误?【英文标题】:Unable to copy file from bundle to Documents directory, why does fileExistsAtPath return error?无法将文件从包复制到 Documents 目录,为什么 fileExistsAtPath 返回错误? 【发布时间】:2012-06-06 14:05:57 【问题描述】:

我正在使用以下 sn-p 代码尝试将文件从我的应用程序资源目录复制到文档区域。我在 Github 上使用了 PocketOCR 项目中的以下内容:

// Set up the tessdata path. This is included in the application bundle
    // but is copied to the Documents directory on the first run.
    NSString *dataPath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"tessdata"];
    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSLog(@"Datapath is %@", dataPath);
    // If the expected store doesn't exist, copy the default store.
    if (![fileManager fileExistsAtPath:dataPath ]) 
        NSLog(@"File didn't exist at datapath...");
        // get the path to the app bundle (with the tessdata dir)
        NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
        NSString *tessdataPath = [bundlePath stringByAppendingPathComponent:@"tessdata"];
        if (tessdataPath) 
            [fileManager copyItemAtPath:tessdataPath toPath:dataPath error:NULL];
        
    

这是我通过调用上面得到的输出:

2012-06-06 14:53:42.607 MyApp[1072:707] 数据路径是 /var/mobile/Applications/9676D920-D6D1-4F86-9177-07CC3247A124/Documents/tessdata 打开数据文件时出错 /var/mobile/Applications/9676D920-D6D1-4F86-9177-07CC3247A124/Documents/tessdata/eng.traineddata

我的 xcode 项目中有 eng.traineddata 文件,就像这样

在尝试检查 fileExistsAtPath 时似乎正在报告错误,我不希望这会引发错误,而是返回 YES 或 NO。

有没有更简单的方法可以复制 eng.traineddata 文件,或者我犯了一个可以在此处更正的错误?

【问题讨论】:

【参考方案1】:
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

NSString *dataPath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"tessdata"];
NSLog(@"Datapath is %@", dataPath);

// If the expected store doesn't exist, copy the default store.    
    if ([fileManager fileExistsAtPath:dataPath] == NO)
    
        NSString *tessdataPath = [[NSBundle mainBundle] pathForResource:@"eng" ofType:@"traineddata"];
        [fileManager copyItemAtPath:tessdataPath toPath:dataPath error:&error];

    


-(NSString*) applicationDocumentsDirectory
    // Get the documents directory
    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsDir = [dirPaths objectAtIndex:0];
    return docsDir;

【讨论】:

什么是[self applicationDocumentsDirectory]?缺少/不完整的代码? 代码不完整,常用的封装路径查找代码的方法,示例见(虽然在这种情况下返回NSURL)***.com/questions/5608091/…【参考方案2】:

我也希望能帮助这段代码将所有类型的文件包复制到文档目录文件夹..

NSString *pathsToReources = [[NSBundle mainBundle] resourcePath];
NSString *yourOriginalDatabasePath = [pathsToReources stringByAppendingPathComponent:@"lunchDB.sqlite"];  // file name u want copy 

NSArray *pathsToDocuments = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [pathsToDocuments objectAtIndex: 0];


    NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"lunchDB.sqlite"];  // file name & your original path (Document path)

    if (![[NSFileManager defaultManager] isReadableFileAtPath: dbPath]) 

if ([[NSFileManager defaultManager] copyItemAtPath: yourOriginalDatabasePath toPath: dbPath error: NULL] != YES)

NSAssert2(0, @"Fail to copy database from %@ to %@", yourOriginalDatabasePath, dbPath);


谢谢..

【讨论】:

【参考方案3】:

使用NSFileManager的方法fileExistsAtPath:isDirectory:,并指定路径是目录,因为它是。

【讨论】:

【参考方案4】:

stringByAppendingPathComponent:@"tessdata"

上面的行要求 tessdata 是 Xcode 项目中的物理文件夹(蓝色文件夹),而不是组(您显示的黄色文件夹)。使用 Finder 在您的 Xcode 项目文件夹中创建一个文件夹,然后在 Xcode 中将该文件夹拖放到您的项目中,并在询问时选择文件夹引用。

【讨论】:

以上是关于无法将文件从包复制到 Documents 目录,为啥 fileExistsAtPath 返回错误?的主要内容,如果未能解决你的问题,请参考以下文章

将多个文件复制到 Documents 目录

将文件夹移动到 Documents 目录

如何将 SQLite 文件从 Documents 目录保存回目标 C 中的主包?

如何将文件从谷歌计算引擎复制到本地目录

将通配符文件名从主包复制到文档?

将领域从 Bundle 复制到 Documents,然后将其读入本地常量,在 Swift 2.0 中