Xamarin 获取各个平台文件存储路径

这篇文章介绍获取各个平台存储路径的方式。

为了保存各类程序运行所需文件,比如 SQLite 数据库,你可能需要用到文件存储路径。每个平台都有规定的位置进行存放,比如在 Windows 中数据存储在 AppData 中, Android 和 iOS 存放在 /data 的私有空间中,而且请注意 Windows 的路径分隔符是 \ 而 UNIX 及其衍生系统中使用 /

关键词:Xamarin Xamarin.Forms Android iOS WPF UWP 文件夹 路径 C#

现代实现方式

Xamarin 已经弃用 PCL(可移植类库)而使用 .NET Standard 2.0 。此时你只需要一句 var localFolder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); 即可获得对应平台的数据存放路径,并且使用 Path.Combine(LocalFolder, fileName) 方法拼接文件夹路径和文件名,而不必考虑分隔符是斜杠还是反斜杠。

其它实现方式

分别实现

方法是使用依赖服务(Dependency Service)。

下面列出了各个平台的获取方式。请分别在各个平台中定义一个类,使用下面获取的变量实现在 Xamarin.Forms 中定义的服务接口。

简单来说,在类库中定义一个类似 IFileHelper 的接口,要求实现一个返回 string 类型的 GetPath() 方法,然后在各平台中继承此接口,并在 GetPath() 方法中返回各平台的路径,最后在命名空间上添加 Dependency Attribute。

关于具体操作方式,请参阅依赖服务。

// Android 私有文件夹路径
string personalFolder = System.Environment.
GetFolderPath(System.Environment.SpecialFolder.Personal)

// iOS 私有文件夹和库文件夹路径
string personalFolder = System.Environment.
GetFolderPath(Environment.SpecialFolder.Personal);
string libraryFolder = Path.Combine
(personalFolder, "..", "Library");

// UWP 本地文件夹路径
string localFolder = ApplicationData.Current.LocalFolder.Path;

// WPF 本地文件夹路径
string localFolder = System.AppDomain.CurrentDomain.BaseDirectory;

请注意,在 WPF 中使用 Directory.GetCurrentDirectory() 方法获取的并不是程序所在文件夹的路径,而是工作路径。比如在 OpenFileDialog 中选择了一个路径,则工作路径会发生变化。

跨平台实现

使用 System.IO.IsolatedStorage API 可以在共享项目(Shared Project)中同时满足 iOS、Andorid 和 其它早期 Windows Phone 设备(包括不支持直接文件系统操作的 Silverlight)。关于如何使用,请参阅参考链接中的 IsolatedStorageFile 类。

然而此 API 不支持 PCL(可移植类库)。你可以为这些类库安装 PCLStorage Nuget 包解决此问题。再次说明,PCL 在 2017 年 11 月已经被 Xamarin 弃用并使用 .NET Standard 2.0 代替,这意味着 PCLStorage 是不再需要的。

Environment.SpecialFolder 枚举

在 Windows 中,使用 System.Environment.GetFolderPath(Environment.SpecialFolder) 方法还可以获取其它路径,比如我的文档中的音乐、图片,桌面,字体,历史,收藏,Program Files 甚至 System 文件夹,请参阅 Environment.SpecialFolder 枚举。

参考链接

Microsoft Docs – Environment.SpecialFolder Enum

Microsoft Docs – IsolatedStorageFile Class

Microsoft Docs – Practical Code Sharing Strategies

Nuget – PCLStorage

MSDN Magazine – Xamarin – Working with Local Databases in Xamarin.Forms Using SQLite

小时 – Xamarin.Forms 访问本地 SQLite 数据库

小时 – Xamarin.Forms 适用于 .NET Standard 的跨平台 SQLite ADO.NET

发表评论

电子邮件地址不会被公开。 必填项已用*标注