《深入浅出Windows Phone 8应用开发》之手机存储卡数据 
  手机存储卡为SD卡(全名为Secure Digital Memory Card),用户扩展手机的信息存储,可以很方便地进行更换和安装。在Windows Phone 8里面第三方程序只有对存储卡的读取权限,包括读取存储卡的文件目录和文件的信息。读取存储卡信息的相API都在Microsoft.Phone.Storage空间下,读取存储卡的信息需要在项目的WMAppManifest.xml文件中添加ID_CAP_REMOVABLE_STORAGE的能力,表示程序需要读取存储卡的信息,否则调用读取存储卡的API将会引发异常。 
 
16.1.1获取存储卡文件夹 
  要读取存储卡文件夹首先需要去识别存储卡设备,识别存储卡设备可以通过ExternalStorage.GetExternalStorageDevicesAsync()方法异步去获取一个存储卡设备的列表,存储卡设备对象用ExternalStorageDevice类表示。ExternalStorageDevice类包含两个属性,一个是ExternalStorageID表示扩展存储的唯一ID字符串,另外一个是RootFolder表示存储卡的根目录,是默认的最顶层的文件夹。ExternalStorageDevice类还包含两个异步方法,一个是GetFileAsync方法通过文件的路径来获取文件的信息,一个是GetFolderAsync方法通过文件夹的路径来获取文件夹的信息。 
  ExternalStorageFolder类表示一个存储卡的文件夹类,里面包含了文件夹的一些详细的信息,以及文件夹的相关方法,ExternalStorageFolder类的成员如表16.1所示。 
  表16.1 ExternalStorageFolder类的成员 
 
  名称 
 
 |   说明 
 
 |    DateModified 
 
 |   文件修改的时间 
 
 |    Name 
 
 |   文件夹的名字 
 
 |    Path 
 
 |   文件夹的路径 
 
 |    GetFilesAsync() 
 
 |   获取该文件夹的所有文件 
 
 |    GetFolderAsync(string name) 
 
 |   获取该文件夹目录下该名字文件夹的信息 
 
 |    GetFoldersAsync() 
 
 |   获取该文件夹下面所有的文件夹 
 
 |     下面开看一下获取存储卡文件目录的代码示例: 
 
 
 
    async void GetFolder() 
{ 
// 获取扩展的存储卡列表 
IEnumerable  deviceList = await ExternalStorage.GetExternalStorageDevicesAsync(); 
// 遍历存储卡列表 
foreach (ExternalStorageDevice device in deviceList) 
{ 
// 遍历存储卡根目录 
foreach (ExternalStorageFolder folder in await device.RootFolder.GetFoldersAsync()) 
{   // 遍历存储卡里面的文件夹 
foreach (ExternalStorageFolder folder2 in await folder.GetFoldersAsync()) 
{ 
// 获取文件夹的信息 如名字folder2.Name等 
                } 
} 
} 
} 
   
 
16.1.2获取存储卡文件 
  ExternalStorageFile类表示一个存储卡的文件类,里面包含了文件的一些详细的信息,以及打开文件的方法,ExternalStorageFile类的成员如表16.2所示。要读取存储卡的文件,必须要先读取出文件夹之后,然后再通过ExternalStorageFolder类的GetFilesAsync()的方法来获取该文件夹下的所有文件,如果知道文件的存储路径也可以使用ExternalStorageDevice存储卡设别类的GetFileAsync(string filePath)方法来获取具体路径的文件。 
  表16.2 ExternalStorageFile类的成员 
 
  名称 
 
 |   说明 
 
 |    DateModified 
 
 |   文件修改的时间 
 
 |    Name 
 
 |   文件夹的名字 
 
 |    Path 
 
 |   文件夹的路径 
 
 |    Task OpenForReadAsync() 
 
 |   打开文件夹的方法 
 
 |     下面开看一下获取存储卡根目录文件的代码示例: 
 
 
 
    async void GetFile() 
{ 
// 获取扩展的存储卡列表 
IEnumerable deviceList = await ExternalStorage.GetExternalStorageDevicesAsync(); 
// 遍历存储卡列表 
foreach (ExternalStorageDevice device in deviceList) 
{    // 遍历存储卡根目录的文件 
foreach (ExternalStorageFile file in await device.RootFolder.GetFilesAsync()) 
{ 
// 处理文件的信息 
            } 
} 
} 
16.1.3实例:读取存储卡信息 
 
下面给出读取存储卡信息的示例:在手机应用程序里面读取手机的存储卡的信息,按照文件夹目录一层层来展示存储卡的文件。 
代码清单16-1:读取存储卡信息(源代码:第16章\Examples_16_1)  
  MainPage.xaml文件主要代码 
 
 
 
         
 
 
 
 
 
 
 
 
  
  MainPage.xaml.cs文件代码 
 
 
 
using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Controls; 
using Microsoft.Phone.Controls; 
using Microsoft.Phone.Storage; 
namespace SDCardDemo 
{ 
public partial class MainPage : PhoneApplicationPage 
{ 
IEnumerable deviceList;// 存储卡设备列表 
public MainPage() 
{ 
InitializeComponent(); 
} 
// 打开存储卡的根目录 
private async void btGetFile_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
// 获取存储卡设备列表 
deviceList = await ExternalStorage.GetExternalStorageDevicesAsync(); 
lbFolder.Items.Clear(); 
foreach (ExternalStorageDevice device in deviceList) 
{ 
// 把获取到的设备根目录信息添加到ListBox控件里面 
ListBoxItem item = new ListBoxItem(); 
item.Content = "根目录"+device.ExternalStorageID; 
item.DataContext = device.RootFolder; 
lbFolder.Items.Add(item); 
} 
} 
// 打开文件夹获取文件夹里面的文件夹和文件 
private async void Button_Click_1(object sender, System.Windows.RoutedEventArgs e) 
{ 
if (lbFolder.SelectedIndex == -1) 
{ 
MessageBox.Show("请选择一个文件夹"); 
} 
else 
{ 
// 获取选中的文件夹 
ListBoxItem item = lbFolder.SelectedItem as ListBoxItem; 
ExternalStorageFolder externalStorageDevice = item.DataContext as ExternalStorageFolder; 
// 获取文件夹中的文件夹 
IEnumerable folderList= await externalStorageDevice.GetFoldersAsync(); 
lbFolder.Items.Clear(); 
foreach (ExternalStorageFolder folder in folderList) 
{ 
// 把获取到的文件夹信息添加到ListBox控件里面 
ListBoxItem item2 = new ListBoxItem(); 
item2.Content = "文件夹:" + folder.Name; 
item2.DataContext = folder; 
lbFolder.Items.Add(item2); 
} 
// 获取文件夹中的文件 
IEnumerable fileList = await externalStorageDevice.GetFilesAsync(); 
lbFile.Items.Clear(); 
foreach (ExternalStorageFile file in fileList) 
{ 
// 把获取到的文件信息添加到ListBox控件里面 
ListBoxItem item3 = new ListBoxItem(); 
item3.Content = "文件:" + file.Name; 
item3.DataContext = file; 
lbFile.Items.Add(item3); 
} 
} 
} 
} 
} 
  程序的运行效果如图16.1所示。 
 
 
   |