UWP首次启动复制安装目录数据库至本地文件夹遇异常问题
解决UWP首次启动复制数据库到本地文件夹的异常问题
你的核心思路是对的,但直接运行这段代码大概率会抛出文件已存在的异常,另外针对大容量数据库文件,我们也需要完善异常处理和复制逻辑。下面是优化后的解决方案:
关键问题分析
- 当应用第二次启动时,
LocalFolder里已经存在mydbfile.db,直接调用CopyAsync会触发FileExistsException - 没有对源文件是否存在做校验,万一
Assets里的数据库文件路径写错或缺失,也会抛出异常
优化后的完整代码
private async Task CopyDatabaseToLocalFolderAsync() { string dbFileName = "mydbfile.db"; Uri sourceUri = new Uri("ms-appx:///Assets/mydbfile.db"); StorageFolder localFolder = ApplicationData.Current.LocalFolder; try { // 先检查目标文件夹是否已存在该数据库 StorageFile existingDb = await localFolder.TryGetItemAsync(dbFileName) as StorageFile; if (existingDb != null) { // 可选操作:如果需要覆盖旧文件,取消下面的注释 // await existingDb.DeleteAsync(); return; // 文件已存在,直接返回,避免重复复制 } // 获取源数据库文件 StorageFile sourceDb = await StorageFile.GetFileFromApplicationUriAsync(sourceUri); // 复制文件到本地文件夹,指定如果存在则替换(根据需求调整选项) // 针对大文件,这个方法会自动处理异步流,无需额外操作 await sourceDb.CopyAsync(localFolder, dbFileName, NameCollisionOption.ReplaceExisting); Debug.WriteLine("数据库复制成功!"); } catch (FileNotFoundException) { Debug.WriteLine("错误:Assets文件夹中未找到指定的数据库文件,请检查路径和文件名!"); } catch (Exception ex) { Debug.WriteLine($"复制过程中发生异常:{ex.Message}"); } }
额外注意事项
- 确保你的数据库文件
mydbfile.db已经添加到项目的Assets文件夹中,并且在属性窗口里设置生成操作为内容,复制到输出目录为始终复制或如果较新则复制 - 如果数据库文件特别大,不需要额外的进度监听的话,上面的代码足够稳定;如果需要显示复制进度,可以考虑使用
FileIO.CopyAsync结合流操作,但对于大多数场景,CopyAsync已经足够高效 - 建议在应用的
OnLaunched方法中调用这个异步方法,确保首次启动时完成复制:
protected override async void OnLaunched(LaunchActivatedEventArgs e) { // ... 其他初始化代码 ... await CopyDatabaseToLocalFolderAsync(); // ... 后续逻辑 ... }
内容的提问来源于stack exchange,提问作者MD Amanullah Hoque
相关产品推荐
相关产品推荐

