c# - 从 Xamarin Forms 应用程序写入 Android 上的“文档”文件夹
问题描述
我正在尝试从 Xamarin Form 应用程序的文件夹中合并一些 txt 文件。
用户可以选择路径(我为此创建了一个简单的文件夹浏览器)。
例如源路径是
/storage/1EE7-170F/
我收集该文件夹中的所有 txt 文件,使用 File.ReadAllText 读取它们,进行一些处理。到目前为止工作正常。
我还想使用 File.WriteAllText 将结果写入同一文件夹中的新文件。目标文件将是:
/storage/1EE7-170F/SomeResultFile.txt
获取目录内容在 AppName.Android 中:
var fileContents = Directory.GetFiles(baseDirectory.FullPath, searchPattern)
.Select(fullPath =>
{
var fileName = Path.GetFileName(fullPath);
var extension = Path.GetExtension(fullPath);
return new FileContent(fileName, fullPath, extension);
});
在普通项目中读取文件是这样的:
var content = File.ReadAllText(fileContent.FullPath);
文件是这样写的(也在普通项目中):
var baseDir = Path.GetDirectoryName(sourceFiles.First().FullPath);
var targetFilePath = Path.Combine(baseDir, filename);
File.WriteAllLines(targetFilePath, lines);
但我总是得到一个 UnauthorizedAccessException 说“访问路径“/storage/1EE7-170F/SomeResultFile.txt”被拒绝。
我想知道为什么我可以从那个文件夹中读取,但不能写入它。
写入 System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal) 工作正常,但这不是我需要的。我需要与源文件位于同一目录中的结果文件。
我在清单中同时启用了“READ_EXTERNAL_STORAGE”和“WRITE_EXTERNAL_STORAGE”权限。
在 MainActivity.OnCreate 我添加了以下内容:
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted)
{
ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.WriteExternalStorage }, 0);
}
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != (int)Permission.Granted)
{
ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage }, 0);
}
我在 Android 模拟器和安装了最新 Android 的 S10 上都试过了(在 S10 上我选择了“Documents”文件夹)。具有不同文件夹的两个系统上的结果相同...
任何想法可能是什么问题?
非常感谢您的帮助!
解决方案
推荐阅读
- mongodb - mongoDB条件增量
- java - Android Studio - 如何让小部件打开 URL 而不是 MainActivity
- python - 在将mysql数据从一个表迁移到另一个表时,mysql中的空值在python中被转换为none
- java - Java GraphQL dgs 客户端
- vue.js - 将 v-text-field 数字输入限制为单个数字
- flutter - 如何在飞镖中增加 DateTime.now
- google-chrome - 如何在 Chrome 上使用复制的 url 打开弹出窗口
- python - 如何使用 python 请求获取本网站的 html?
- django-models - 如何在一对一字段列表中按名称插入搜索
- three.js - InstancedMesh 不反映具有自定义顶点着色器的虚拟矩阵的比例