Xamarin.Forms - 如何访问 /data/user/0/com.companyname.notes/files/.local/share/

Ger*_*lde 7 xamarin.forms

我正在关注 微软的一个小教程。
这基本上将您的文本输入保存到设备的内部存储器中。

String _filename = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Notes.txt");
Run Code Online (Sandbox Code Playgroud)

结果是:/data/user/0/com.companyname.notes/files/.local/share/Notes.txt对我来说。

现在,虽然一切正常,但我希望在文件夹中看到这个 Notes.txt 文件。

我进行了广泛的搜索,但似乎找不到在我的设备上找到此文件的方法。
我可以转到Android/data/com.companyname.notes/files但随后我只看到一个._override_文件夹,其中包含应用程序项目文件,但没有Notes.txt

有任何想法吗?

谢谢

Che*_*SFT 4

从你的路径:/data/user/0/com.companyname.notes/files/.local/share/Notes.txt可以知道你要访问内部存储,但是内部存储是指非易失性内存, Android 分配给操作系统、APK 和单个应用程序。除操作系统或应用程序外,无法访问此空间。因此您无法从内部存储中找到该文本文件。

如果您想查看文件,可以将此文件保存在外部存储中

/storage/emulated/0/Android/data/com.companyname.app/files

有关内部存储的更多详细信息,请参阅:

https://learn.microsoft.com/en-us/xamarin/android/platform/files/

更新

如果要保存文本文件,则应在 AndroidManifest.xml 中声明外部存储的两种权限之一

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

然后通过调用方法 Android.Content.Context.GetExternalFilesDir(string type) 找到私有外部文件的主要位置。此方法将返回一个 Java.IO.File 对象,该对象表示应用程序的私有外部存储目录。向此方法传递 null 将返回应用程序的用户存储目录的路径。例如,对于包名为 com.companyname.app 的应用程序,私有外部文件的“根”目录将是:

/storage/emulated/0/Android/data/com.companyname.app/files/

在表单中,您需要创建新的界面:

 public interface IFileSystem
{
    string GetExternalStorage();
}
Run Code Online (Sandbox Code Playgroud)

在Android中实现该接口:

[assembly: Dependency(typeof(FileSystemImplementation))]
Run Code Online (Sandbox Code Playgroud)

命名空间 FileApp.Droid { 公共类 FileSystemImplementation : IFileSystem { 公共字符串 GetExternalStorage() { Context context = Android.App.Application.Context; var filePath = context.GetExternalFilesDir(""); 返回文件路径.Path; } } }

现在您可以创建文本文件并将文本保存在该文件中:

 private async void Btn1_Clicked(object sender, EventArgs e)
    {
        var folderPath = DependencyService.Get<IFileSystem>().GetExternalStorage();
        var file = Path.Combine(folderPath, "count.txt");

        using (var writer = File.CreateText(file))
        {
            await writer.WriteLineAsync("123456789000000000000000000000000000000000000");
        }
    }
Run Code Online (Sandbox Code Playgroud)

我做了一个样本:

https://github.com/CherryBu/FileApp

私有外部存储目录的确切路径可能因设备和 Android 版本而异。