×
Namespaces

Variants
Actions

Windows Phone 8 手机存储卡数据

From Nokia Developer Wiki
Jump to: navigation, search

手机存储卡为SD卡(全名为Secure Digital Memory Card),用户扩展手机的信息存储,可以很方便地进行更换和安装。在Windows Phone 8里面第三方程序只有对存储卡的读取权限,包括读取存储卡的文件目录和文件的信息。读取存储卡信息的相API都在Microsoft.Phone.Storage空间下,读取存储卡的信息需要在项目的 WMAppManifest.xml 文件中添加ID_CAP_REMOVABLE_STORAGE的能力,表示程序需要读取存储卡的信息,否则调用读取存储卡的API将会引发异常。 获取存储卡文件夹 要读取存储卡文件夹首先需要去识别存储卡设备,识别存储卡设备可以通过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<ExternalStorageDevice> 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等
}
}
}
}


获取存储卡文件 ExternalStorageFile类表示一个存储卡的文件类,里面包含了文件的一些详细的信息,以及打开文件的方法,ExternalStorageFile类的成员如表16.2所示。要读取存储卡的文件,必须要先读取出文件夹之后,然后再通过ExternalStorageFolder类的GetFilesAsync()的方法来获取该文件夹下的所有文件,如果知道文件的存储路径也可以使用ExternalStorageDevice存储卡设别类的GetFileAsync(string filePath)方法来获取具体路径的文件。

  • DateModified文件修改的时间
  • Name文件夹的名字
  • Path文件夹的路径
  • Task<IO.Stream> OpenForReadAsync()打开文件夹的方法

下面开看一下获取存储卡根目录文件的代码示例:

    async void GetFile()
{
// 获取扩展的存储卡列表
IEnumerable<ExternalStorageDevice> deviceList = await ExternalStorage.GetExternalStorageDevicesAsync();
// 遍历存储卡列表
foreach (ExternalStorageDevice device in deviceList)
{ // 遍历存储卡根目录的文件
foreach (ExternalStorageFile file in await device.RootFolder.GetFilesAsync())
{
// 处理文件的信息
}
}
}

实例:读取存储卡信息 下面给出读取存储卡信息的示例:在手机应用程序里面读取手机的存储卡的信息,按照文件夹目录一层层来展示存储卡的文件。 代码清单16-1:读取存储卡信息(源代码:第16章\Examples_16_1)

MainPage.xaml文件主要代码

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel>
<Button Content="获取SD卡的文件信息" x:Name="btGetFile" Margin="0,0,0,80" Click="btGetFile_Click"/>
<TextBlock Text="文件夹列表:"/>
<ListBox x:Name="lbFolder"></ListBox>
<Button Content="打开选中的文件夹" Click="Button_Click_1" />
<TextBlock Text="文件列表:" Margin="0,50,0,0"/>
<ListBox x:Name="lbFile"></ListBox>
</StackPanel>
</Grid>

MainPage.xaml.cs文件代码

namespace SDCardDemo
{
public partial class MainPage : PhoneApplicationPage
{
IEnumerable<ExternalStorageDevice> 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<ExternalStorageFolder> 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<ExternalStorageFile> 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);
}
}
}
}
}
This page was last modified on 11 September 2013, at 03:43.
221 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×