.NET MAUI修改JSON文件遇FileNotFoundException问题求助
.NET MAUI读写JSON文件路径不一致问题
我正在做一个学校项目,用.NET MAUI开发应用,想从MAUI的raw文件夹读取JSON文件、修改值后更新文件。读取部分正常,但写入时提示找不到文件。
我的代码如下:
string jsonArchiveName = "test.json"; // Read the json using Stream fileStream = await FileSystem.OpenAppPackageFileAsync(jsonArchiveName); using StreamReader reader = new StreamReader(fileStream); string json = reader.ReadToEnd(); // modfy the json dynamic obj = JsonConvert.DeserializeObject<dynamic>(json); obj.objeto.value = num; string output = JsonConvert.SerializeObject(obj); // and finaly write on the json using FileStream fileStreamWrite = new FileStream(jsonArchiveName, FileMode.Truncate); byte[] messageByte = Encoding.ASCII.GetBytes(output); fileStreamWrite.Write(messageByte, 0, messageByte.Length);
错误出在using FileStream fileStreamWrite = new FileStream(jsonArchiveName, FileMode.Truncate);这一行,抛出异常:
System.IO.FileNotFoundException: 'Could not find file 'C:\Windows\system32\teste2.json'.'
不清楚为什么写入时的查找路径和读取时用FileSystem.OpenAppPackageFileAsync的路径不一样。
问题原因
- 应用包内的文件(raw文件夹)是只读的,无法直接修改。
FileSystem.OpenAppPackageFileAsync读取的是应用安装目录里的文件,该路径仅拥有读取权限。 - 直接使用
FileStream写入文件名时,默认会去当前工作目录(比如Windows下的C:\Windows\system32)查找文件,而非应用包路径,因此会出现找不到文件的错误。
解决方法
要修改文件,需先把raw文件夹里的JSON文件复制到可写的应用数据目录,之后的读写操作都针对这个副本进行:
修改后的代码示例:
string jsonFileName = "test.json"; // 获取应用可写数据目录的文件路径 string targetFilePath = Path.Combine(FileSystem.AppDataDirectory, jsonFileName); // 第一步:如果数据目录里没有文件,从应用包复制过去 if (!File.Exists(targetFilePath)) { using Stream packageStream = await FileSystem.OpenAppPackageFileAsync(jsonFileName); using FileStream fileStream = new FileStream(targetFilePath, FileMode.Create); await packageStream.CopyToAsync(fileStream); } // 第二步:读取应用数据目录里的文件 string json = await File.ReadAllTextAsync(targetFilePath); dynamic obj = JsonConvert.DeserializeObject<dynamic>(json); obj.objeto.value = num; string output = JsonConvert.SerializeObject(obj); // 第三步:写回应用数据目录的文件 await File.WriteAllTextAsync(targetFilePath, output);
关键说明
FileSystem.AppDataDirectory对应各平台的可写应用数据目录,例如:- Windows:
C:\Users\<用户名>\AppData\Local\<应用标识> - Android:
/data/data/<包名>/files - iOS:
Library/Application Support
- Windows:
- 应用包内的文件在安装后处于只读状态,无法直接修改,必须操作其副本。
内容的提问来源于stack exchange,提问作者Miguel MP
相关产品推荐
相关产品推荐

