用户库可以用来存放用户喜爱的媒体文件、图片以及用户创建的文件,根据其中存放内容的不同类型,用户库分为图片库、音乐库、文档库和视频库,在应用程序中,通过使用相应的API可以向这些库中添加新的文件、文件夹或者重新组织存放在用户库中的文件。本节将详细讲解这部分内容,不过在开始之前先介绍一下这里会用到的相关API,供读者参考。

13.2.1 API参考

为了实现对用户库的各种操作,本节主要会用到以下类、方法和属性。

q  KnownFolders类,提供对用户库中常见位置的访问,如图片库、文档库、音乐库等。以下为此类的一些常用属性。

m  DocumentsLibrary,获取文档库。

m  MusicLibrary,获取音乐库。

m  PicturesLibrary,获取图片库。

m  VideosLibrary,获取视频库。

q  StorageFolder类,获取文件夹及文件夹中内容的相关信息,并且提供一些操作它们的方法。以下为StorageFolder类的一些常用方法。

m  CreateFileAsync(String),在文件夹中创建一个新的文件,String类型参数代表文件名。

m  CreateFileAsync(String, CreationCollisionOption),在当前文件夹中创建一个新的文件,如果原文件之前存在,则可选择将其覆盖或者打开等操作。

m  GetFilesAsync(),从当前文件夹中获取其子文件列表。

m  GetFolderAsync(),从当前的文件夹中获取一个子文件夹。

m  GetFoldersAsync(),从当前文件夹中获取其子文件夹的列表。

q  StorageFile类,获取文件及文件内容的相关信息,并且提供一些操作它们的方法。以下是StorageFile类的一些常用方法。

m  OpenAsync()打开一个指定的文件并返回随机访问流。

m  OpenReadAsync(),在当前文件中打开一个随机访问流,以读取文件中的内容。

m  DeleteAsync(),删除当前文件。

q  FileIO类,提供对文件读取和写入方法。以下为FileIO类的一些常用方法。

m  WriteTextAsync(IStorageFile,string),向文件中写入文本数据。

m  WriteTextAsync(IStorageFile, String, UnicodeEncoding),向文件中写入文本数据,并指定其字符编码。

m  ReadTextAsync(IStorageFile),读取文件的文本数据。

m  ReadTextAsync(IStorageFile, UnicodeEncoding),读取文件的内容,并且指定其字符编码。

m  ReadBufferAsync()读取指定文件的内容,并返回一个缓冲区。

m  WriteBufferAsync(),将缓冲区中的数据写到指定文件中。

给出了一些本节会用到的方法和属性之后,下面来介绍如何使用这些属性和方法对用户库进行操作。

13.2.2 用户库文件操作

1)获取用户库位置

如果想要通过应用程序在用户库中创建文件,首先需要获得用户库中指定的位置,例如图片库、文档库等。这里值得注意的是,在获取用户库的位置之前,必须在Windows应用商店项目的清单文件Package.appxmanifest中开启相应的访问权限,如果应用需要访问音乐库,就需要在Package.appxmanifest文件的功能选项卡中勾选“音乐库”,如图13-4所示。

 

4F267F3EF7C24A9DB08B23B6E0EEF8E1

13-4 开启访问音乐库的权限

以此类推,如果需要访问其他的库位置,可勾选相应的选项以开启访问权限。

在开启相应的权限之后,使用API参考中介绍的KnownFolders类的常用属性就可以获取到音乐库、图片库等位置。示例代码如下所示

//获取文档库位置

StorageFolder documentFolder = KnownFolders.DocumentsLibrary;

//获取音乐库位置

StorageFolder musicFolder = KnownFolders.MusicLibrary;

//获取图片库位置

StorageFolder pictureFolder = KnownFolders.PicturesLibrary;

2)创建文件

在获取了用户库位置之后,使用CreateFileAsync方法及其重载可以在用户库中创建文件,该方法需要获得一个参数来指定文件的名称,如果需要还可以使用另一个CreationCollisionOption类型的参数,指定如果已经存在同名文件时应该执行的操作。CreationCollisionOption是一个枚举,包含四个枚举成员,如下所示:

q  GenerateUniqueName,如果存在同名文件,创建文件时自动在文件名称后面追加一个数字。

q  ReplaceExisting,如果存在同名文件,创建文件时将其替换。

q  FailIfExists,如果存在同名文件,则返回错误。

q  OpenIfExists,如果存在同名文件,则将其打开。

下面的示例代码获取文档库,并在其中创建test.txt文件,若存在同名文件则将其替换。

StorageFolder storageFolder = KnownFolders.DocumentsLibrary;

StorageFile file = await storageFolder.CreateFileAsync("test.txt ", CreationCollisionOption.ReplaceExisting);

3)文件读写

在文档库中创建了一个test.txt文件之后,若想对其进行写入和读取文本的操作,可以通过调用FileIO类的WriteTextAsyncReadTextAsync方法来实现,示例代码如下所示:

//写入文本

await Windows.Storage.FileIO.WriteTextAsync(file, "内容字符串");

//读取文本

string text = await Windows.Storage.FileIO.ReadTextAsync(file);

除了以文本方式读写文件以外,还能以数据流的形式读写文件。在以数据流的形式写入文件内容时,首先需要通过StorageFileOpenAsync方法得到用于写入文件内容的数据流,然后创建一个DataWriter类的对象,使用DataWriter对象的WriteString方法将文本写入到输出流中,写入完成后,调用StoreAsyncFlushAsync方法保存文本并关闭输出流。示例代码如下所示:

var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);

using(var outputStream = stream.GetOutputStreamAt(0))

{

    //文件进行写入操作

    DataWriter dataWriter = new DataWriter(outputStream);

    dataWriter.WriteString("字符串内容");

    await dataWriter.StoreAsync();

    await outputStream.FlushAsync();

}

与写入文件相似,在以数据流形式读取文件时,同样需要首先通过调用OpenAsync方法获得读取文件的数据流,但与写入不同的是,读取文件需要使用DataReader类,通过此类的LoadAsync方法将文件中的内容以数据流的形式读取出来。示例代码如下所示:

var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);

uint size = (uint)stream.Size;

using (var inputStream = stream.GetInputStreamAt(0))

{

   //读取文件的操作

   DataReader dataReader = new DataReader(inputStream);

   uint numBytesLoaded = await dataReader.LoadAsync(size);

   string text = dataReader.ReadString(numBytesLoaded);

}

除了以上两种读写文件的方式,还可通过字节的方式读写文件,采用这种方式,需要一个缓冲区来存储读写数据。这种方式并不常用,在这里就不做过多介绍了,感兴趣的读者可以查阅相关资料。

 

注:本文选自机械工业出版社3月出品的《Windows 8 应用开发权威指南》第12章 文件与数据存储

另外:为在4月27日举办的微软云体验营免费活动做一下宣传。

4月27日 微软云训练营活动,期待您的报名参加,本次活动无需任何费用。

posted on 2013-04-26 11:48  冯瑞涛  阅读(1225)  评论(2编辑  收藏  举报