文件输入/输出
传统上,文件输入/输出是最基本的编程任务之一,但移动设备上的文件I / O与桌面上的文件I / O略有不同。在桌面上,用户和应用程序通常可以访问整个磁盘以及可能还有其他驱动器,所有这些驱动器都被组织到目录结构中。在移动设备上,存在若干标准文件夹 - 例如图片或音乐 - 但是特定于应用程序的数据通常限于每个应用程序专用的存储区域。
熟悉.NET的程序员知道System.IO命名空间包含大量标准文件I / O支持。在这里您可以找到关键的Stream类,它提供了读取和写入组织为字节流的数据的基础。在此基础上构建了几个Reader和Writer类以及允许访问文件和目录的其他类。也许文件中最方便的文件是文件本身,它不仅提供了一组方法来创建新文件和打开现有文件,还包括几个能够在一个文件中执行整个文件读取或文件写入操作的静态方法。单方法调用。
特别是如果您正在使用文本文件,File类的这些静态方法可能非常方便。例如,File.WriteAllText方法有两个类型为string-a file?name和文件内容的参数。该方法创建文件(如果需要,用相同的名称替换现有文件),将内容写入文件,然后关闭它。 File.ReadAllText方法类似,但在一个大字符串对象中返回文件的内容。这些方法非常适合编写和阅读文本文件,而且操作简便。
起初,文件I / O似乎不需要异步操作,在实践中,有时您可以选择,有时您可以避免异步操作。
但是,其他时候你没有选择。某些平台需要文件I / O的异步函数,即使不需要它们,也可以避免在用户界面线程中执行文件I / O。
好消息和坏消息
您的Xamarin.Forms应用程序引用的Xamarin.iOS和Xamarin.Android库包括Xamarin为这两个移动平台明确定制的.NET版本。 System.IO命名空间中的File类中的方法映射到iOS和Android平台中的相应文件I / O函数,而静态Environment.GetFolderPath方法与MyDocuments枚举成员一起使用时,返回应用程序本地的目录存储。这意味着您可以在File类中使用简单方法 - 包括在iOS和Android应用程序中在单个调用中执行整个文件写入或读取操作的静态方法。
为了验证这些类的可用性,让我们进行一些实验:进入Visual Studio或Xamarin Studio并加载到目前为止创建的任何Xamarin.Forms解决方案。在iOS或Android项目中创建一个代码文件。在构造函数或方法中,键入System.IO命名空间名称,然后键入句点。您将获得命名空间中所有可用类型的列表。如果然后键入File和句点,您将获得File类中的所有静态方法,包括WriteAllText和ReadAllText。
但是,在Windows 8.1和Windows Phone 8.1项目中,您正在使用Microsoft专门为这些平台创建的.NET版本。如果键入System.IO和句点,则根本不会看到File类!它不存在! (但是,您会发现它确实存在于UWP项目中。)
现在进入Xamarin.Forms可移植类库项目中的任何代码文件。您可能还记得,Xamarin.Forms的PCL针对以下平台:
- .NET Framework 4.5
- Windows 8
- Windows Phone 8.1
- Xamarin.Android
- Xamarin.iOS
- Xamarin.iOS (Classic)
正如您可能已经预料到的那样,PCL中的System.IO命名空间也缺少File类。 PCL配置为支持多个目标平台。 因此,在PCL内实现的API必然是这些目标平台中的API的交集。
从Windows 8和Windows Runtime API开始,Microsoft完全修改了文件I / O并创建了一组全新的类。 您的Windows 8.1,Windows Phone 8.1和UWP应用程序使用Windows.Storage命名空间中的类来进行文件I / O.
如果您只在Xamarin.Forms应用程序中定位iOS和Android,则可以在两个平台之间共享文件I / O代码。 您可以使用静态File方法和System.IO中的所有其他方法。
如果您还想要定位Windows或Windows Phone平台之一,则需要为每个平台的不同文件I / O逻辑使用DependencyService(在第9章“特定于平台的API调用”中讨论)。