Xamarin.Forms文件处理完全指南

Viewed 0

使用 .NET Standard 库中的代码或嵌入式资源,即可在 Xamarin.Forms 中处理文件。

概述

Xamarin.Forms 代码在多个平台上运行,每个平台都有自己的文件系统。以前,在每个平台上使用本机文件 API 执行文件读写最为容易。此外,嵌入式资源是一种更简单的解决方案,用于通过应用分发数据文件。但是,使用 .NET Standard 2.0 可以共享 .NET Standard 库中的文件访问代码。有关处理图像文件的信息,请参考处理图像页。

保存和加载文件

可以使用 System.IO 类访问每个平台上的文件系统。File 类可以创建、删除和读取文件,Directory 类可以创建、删除或枚举目录的内容。此外,还可以使用 Stream 子类实现对文件操作更大程度的控制,例如压缩或位置搜索。

使用 File.WriteAllText 方法可以编写文本文件:

File.WriteAllText(fileName, text);

使用 File.ReadAllText 方法可以读取文本文件:

string text = File.ReadAllText(fileName);

使用 File.Exists 方法可以确定指定的文件是否存在:

bool doesExist = File.Exists(fileName);

通过使用 Environment.SpecialFolder 枚举的值作为 Environment.GetFolderPath 方法的第一个参数,可以从 .NET Standard 库确定每个平台上文件的路径。然后使用 Path.Combine 方法将其与文件名组合:

string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "temp.txt");

示例应用演示了这些操作,包括保存和加载文本的页面。

加载作为资源嵌入的文件

若要将文件嵌入到 .NET Standard 程序集中,请创建或添加文件并确保生成操作设置为 EmbeddedResource。在 Visual Studio 或 Visual Studio for Mac 中,可以通过项目属性配置。

使用 GetManifestResourceStream 通过资源 ID 访问嵌入文件。默认情况下,资源 ID 是文件名前缀以项目默认命名空间,例如程序集 "WorkingWithFiles" 和文件名 "LibTextResource.txt" 的资源 ID 为 WorkingWithFiles.LibTextResource.txt

var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoadResourceText)).Assembly;
Stream stream = assembly.GetManifestResourceStream("WorkingWithFiles.LibTextResource.txt");
string text = "";
using (var reader = new System.IO.StreamReader(stream))
{
    text = reader.ReadToEnd();
}

然后,text 变量可用于显示文本或在代码中使用。加载和反序列化 XML 也同样简单,以下代码展示从资源加载和反序列化 XML 文件,然后绑定到 ListView 显示:

var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoadResourceText)).Assembly;
Stream stream = assembly.GetManifestResourceStream("WorkingWithFiles.LibXmlResource.xml");
List<Monkey> monkeys;
using (var reader = new System.IO.StreamReader(stream))
{
    var serializer = new XmlSerializer(typeof(List<Monkey>));
    monkeys = (List<Monkey>)serializer.Deserialize(reader);
}
var listView = new ListView();
listView.ItemsSource = monkeys;

共享项目也可以包含嵌入式资源文件,但由于资源 ID 前缀可能因平台而异,有两种解决方案:一是同步项目使用相同程序集名称和默认命名空间;二是使用编译器指令动态构造资源 ID。例如使用 #if 编译器指令:

#if __IOS__
var resourcePrefix = "WorkingWithFiles.iOS.";
#endif
#if __ANDROID__
var resourcePrefix = "WorkingWithFiles.Droid.";
#endif

Debug.WriteLine("Using this resource prefix: " + resourcePrefix);
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(SharedPage)).Assembly;
Stream stream = assembly.GetManifestResourceStream(resourcePrefix + "SharedTextResource.txt");

组织资源

嵌入式资源可以放在文件夹中组织,此时文件夹名称成为资源 ID 的一部分,格式为 "Namespace.Folder.Filename.Extension"。例如,将文件放入 "MyFolder" 文件夹后,资源 ID 变为 WorkingWithFiles.MyFolder.LibTextResource.txt

调试嵌入的资源

如果资源加载有问题,可以添加调试代码输出所有嵌入资源名称以确认配置:

using System.Reflection;
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(SharedPage)).Assembly;
foreach (var res in assembly.GetManifestResourceNames())
{
    System.Diagnostics.Debug.WriteLine("found resource: " + res);
}

总结

本文介绍了在 Xamarin.Forms 中处理文件的基本操作,包括在设备上保存和加载文本文件,以及加载嵌入式资源。使用 .NET Standard 2.0 可以在 .NET Standard 库中共享文件访问代码,简化跨平台开发。

0 Answers