在本地文件夹中存储数据是有限的

Storing data in local folder is limited

我正在尝试将数据本地保存到我的设备应用程序文件夹。

当我尝试在实际的 Android 智能手机上保存收集的数据时,它不起作用。它受名称和文件类型的限制,因为我无法从 test.txt 更改它,并且它的字符串长度受到限制,因为最多可以保存 12 个字符。

我获得了以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这是我的代码:

MainPage.xaml.cs

private async void ExportData(object sender, EventArgs e)
    {
        var items = await App.Database.GetDataAsync();
        DependencyService.Get<IFileService>().CreateFile(items);
    }

界面

using System;
using System.Collections.Generic;
using System.Text;

namespace LocationApp.Interface
{
    public interface IFileService
    {
        void CreateFile(List<LocationData> items);
    }
}

服务

using Android.App;
using LocationApp.Droid;
using LocationApp.Interface;
using System.Collections.Generic;
using System.IO;

[assembly:Xamarin.Forms.Dependency(typeof(FileService))]
namespace LocationApp.Droid
{
    public class FileService : IFileService
    {
        public string GetRootPath()
        {
            return Application.Context.GetExternalFilesDir(null).ToString();
        }

        public void CreateFile(List<LocationData> items)
        {
            var fileName = "test-file.txt";
            var destination = Path.Combine(GetRootPath(), fileName);
            string[] text = new string[items.Count];

            for (int i = 0; i < text.Length; i++)
            {
                text[i] = $"{items[i].Latitude},{items[i].Longitude},{items[i].Day},{items[i].Time}";
            }

            File.WriteAllLines(destination, text);
        }
    }
}

我也试图看看模拟器会发生什么,我使用了带有 Android 9.0、API 28 的 Pixel 2,但出现以下错误: [ContextImpl] Failed to ensure /storage/120E-0B1B/Android/data/com.companyname.locationapp/files: java.lang.IllegalStateException: Failed to prepare /storage/120E-0B1B/Android/data/com.companyname.locationapp/files/: android.os.ServiceSpecificException: (code -13)

最后,我只关心将所有数据放在一个文件中。我提供的文件名或模拟器错误,以防错误基于此。如果不是,我不在乎他们是不是 fixed/fixable.

根据你的代码,我创建了一个简单的演示,它可以在我的 android 模拟器上运行(android 11) .

你可以在你这边测试。

密码是:

    public void CreateFile(List<LocationData> items)
    {
        var fileName = "test-file.txt";

        var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);

        var destination = Path.Combine(documentsPath, fileName);
        string[] text = new string[items.Count];

        for (int i = 0; i < text.Length; i++)
        {
            text[i] = $"{items[i].Latitude},{items[i].Longitude}";
        }

        File.WriteAllLines(destination, text);
    }

而我保存数据后,可以通过以下代码获取保存的数据(文件名为test-file.txt):

    public string ReadData(string filename)
    {
        var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        var filePath = Path.Combine(documentsPath, filename);
        return File.ReadAllText(filePath);
    }