Xamarin中检测SQLite数据库文件存在并新建、解决路径访问被拒问题
问题原因
你当前直接使用相对路径ReportData.db,应用运行时会将该相对路径解析到当前工作目录下,多数场景下这个目录是系统受保护的路径(比如Windows的Program Files目录、Linux根目录、应用沙盒禁止访问的路径),你的应用进程没有该路径的写入权限,因此抛出System.UnauthorizedAccessException异常。
解决方案
核心是将数据库文件存到应用拥有写入权限的目录下,不同场景的路径获取和修改代码如下:
1. 桌面应用(WinForms/WPF/.NET控制台/.NET Framework)
优先存储到当前用户的专属应用数据目录,该目录默认开放读写权限:
// 拼接合法可写入路径 string appDataDir = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "你的应用自定义名称" ); // 先确保上级目录存在 if (!Directory.Exists(appDataDir)) { Directory.CreateDirectory(appDataDir); } string path = Path.Combine(appDataDir, "ReportData.db"); private void Create_db() { if (!System.IO.File.Exists(path)) { SQLiteConnection.CreateFile(path); using (var sqlite = new SQLiteConnection(@"Data Source=" + path)) { sqlite.Open(); string sql = "create table temp(date varchar(20),activity varchar(1000))"; SQLiteCommand command = new SQLiteCommand(sql, sqlite); command.ExecuteNonQuery(); // 无需手动调用Close,using会自动释放连接关闭数据库 } } }
2. 跨平台应用(MAUI/安卓/iOS/UWP/WinUI3)
使用对应平台提供的沙盒可写目录:
- MAUI:使用
FileSystem.AppDataDirectory作为上级目录拼接路径 - UWP/WinUI3:使用
ApplicationData.Current.LocalFolder.Path作为上级目录拼接路径
注意事项
- 所有路径都用
Path.Combine拼接,自动适配不同操作系统的路径分隔符,避免兼容性问题 - 调试阶段如果需要把数据库放在程序运行目录方便查看,可使用
Path.Combine(AppContext.BaseDirectory, "ReportData.db"),该方式仅适用于调试,正式发布后如果程序安装到系统受保护目录仍会有权限问题 - 不要手动拼接硬编码的根目录路径,避免权限不足或系统差异问题
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

