首页 > 解决方案 > 从 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”文件夹)。具有不同文件夹的两个系统上的结果相同...

任何想法可能是什么问题?

非常感谢您的帮助!

标签: c#xamarin.formsxamarin.android

解决方案


推荐阅读