XAMARIN表格和存储文件的开放问题

标题图像显示库

涉及到文件处理和Xamarin表单时,您可以找到官方文档中所需的一切。但是,当涉及到数据应该存储数据的位置,文档留下了一些点打开。此外,甚至可能导致,亲爱的,我说它,你在App Store中的拒绝...

此外,当编写跨平台代码时,使用.NET标准,它确实取决于应用程序正在执行的操作系统(OS),在其中存储数据。因此,让我们潜入主要由Xamarin形式支持的平台。

Xamarin.Essentss.

最舒适的方法是使用Xamarin.Essentials。目前还在预览中,需要Android 7.1或更高版本。但是,如果这不让您闪烁,这些是选项:

  • 本地存储也备份。
  • 缓存存储,即用于缓存文件但在非永久性方面都有更多。
  • 与应用程序捆绑的文件,即只读文件。

您可以访问文件夹路径,如下所示:

var rootDirectory = FileSystem.AppDataDirectory;

目前Xamarin.Essentials支持Android,iOS和UWP。因此,如果您的应用程序所需的所有平台都被命名,并且您不需要任何其他位置。务必退房 Xamarin.Essentss. 并检查一下 文件 for more details.

自己做

在大多数情况下,Xamarin.Exessents提供的文件夹就足够了,但如果您需要不同的文件夹,即iOS下的文档文件夹,您可以始终将路径设置为您自己的位置。所以让我们看看你如何实现这一目标。

安卓

现在,在涉及Android时,您可以按照Microsoft遵循文档,并使用以下路径存储文件:

_rootDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Looking to cache some files, then we can take the path and with Path.Combine set the path to the cache folder:

_cacheDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "..", "cache");

如果要将文件存储到SD卡,即Android下的外部存储。您必须通过平台项目到.NET标准项目的路径或使用多算法来实现这一目标。您可以如下获取路径:

var sdCardPath = Environment.ExternalStorageDirectory.AbsolutePath;

Note that the Environment here is 安卓.OS.Environment and not System.Environment. So if Android is this easy how hard can iOS be?

iOS.

在IOS下存储文件时,可以读取更多文档。 Apple的原因是沙箱容器内的多个子文件夹。对于文件存储很重要的是以下内容:

  • 文件: 在此文件夹中,只能存储用户创建的文件。没有应用程序数据,包括应用程序的JSON文件,应在此处存储。此文件夹自动备份。
  • 图书馆: 您不希望用户不希望的任何应用程序数据的理想位置应该直接访问。此文件夹自动备份。

    • 库/偏好: 您不应该直接访问的子目录。更好地使用 Xamarin.Essentss. 用于存储任何键/值数据的库。此数据会自动备份。
    • 图书馆/缓存: 这是存储可以轻松重新创建数据的优秀位置。此数据未备份。
  • TMP: 适用于临时文件,您应该在不再使用时删除。

有关更详细的清单查看 译文。因此,在存储文件时,您将在iOS下,此代码将指向文档文件夹:

_rootDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

如果打算将信息存储到库文件夹中,则可以更改目录,如下所示:

_rootDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "..", "Library");

同样,您可以将路径更改为上述其他位置之一。

uwp.

uwp. apps usually also store their data in a sandbox. Only if in the app’s metadata the permission is set and a good reason was given, which Microsofts validates on submission to the store, can the app access other file locations outside of the sandbox. UWP apps also live in a sandbox. The ApplicationData offers to store data locally, roaming or in a temporary location. The local folder can be accessed as follows:

_rootDirectory = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

类似于其他位置可以访问例如漫游文件夹(在所有不同设备上自动同步):

_rootDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "..", "RoamingState");

uwp. 应用程序沙箱中存在以下目录:

uwp. 容器文件夹:AC,AppData,LocalCache,LocalState,RoamingState,Settings,SystemAppData,TempState

但是,如果我定位其他平台,怎么办?

由于XAMARIN表单不再限于Android,iOS和UWP,因此您可能会发现自己想要在其他系统上写入文件,如Tizen。最佳解决方案是检查应存储数据的给定平台的文档,然后在平台上运行以下代码:

class Gnabber 
{ 
    // ... 
    private IEnumerable<DirectoryDesc> DirectoryDescriptions() 
    { 
        var specialFolders = Enum.GetValues(typeof(Environment.SpecialFolder)).Cast<Environment.SpecialFolder>(); 
        return specialFolders.Select(s => new DirectoryDesc(s.ToString(), Environment.GetFolderPath(s))).Where(d => !string.IsNullOrEmpty(d.Path)); 
    } 
    // ... 
} 
 
class DirectoryDesc 
{ 
    public DirectoryDesc(string key, string path) 
    { 
        Key = key; 
 
        Path = path == null 
            ? "" 
            : string.Join(System.IO.Path.DirectorySeparatorChar.ToString(), path.Split(System.IO.Path.DirectorySeparatorChar).Select(s => s.Length > 18 ? s.Substring(0, 5) + "..." + s.Substring(s.Length - 8, 8) : s)); 
    } 
 
    public string Key { get; set; } 
    public string Path { get; set; } 
}

The code above lists all used folders from the System.Environment.SpecialFolder for the given environment, and also provides you with the absolute path. If none of the special folders is the target location, you desired. Try using Path.Combine and a path nearby to get to your desired location.

结论

Storing files is not tricky but put some thought into where to store your applications data can go a long way. Xamarin.Essentials may provide all the functionality you need, but if not you usually use the System.Environment.SpecialFolders and the System.Environment.GetFolderPath to get access to different folders offered by the platform you are on.

Updated: