文章目錄
- 16.1.1擷取儲存卡檔案夾
- 16.1.2擷取儲存卡檔案
- 16.1.3執行個體:讀取儲存卡資訊
《深入淺出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<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等 } } } }
16.1.2擷取儲存卡檔案
ExternalStorageFile類表示一個儲存卡的檔案類,裡麵包含了檔案的一些詳細的資訊,以及開啟檔案的方法,ExternalStorageFile類的成員如表16.2所示。要讀取儲存卡的檔案,必須要先讀取出檔案夾之後,然後再通過ExternalStorageFolder類的GetFilesAsync()的方法來擷取該檔案夾下的所有檔案,如果知道檔案的儲存路徑也可以使用ExternalStorageDevice儲存卡設別類的GetFileAsync(string filePath)方法來擷取具體路徑的檔案。
表16.2 ExternalStorageFile類的成員
名稱 |
說明 |
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.3執行個體:讀取儲存卡資訊
下面給出讀取儲存卡資訊的樣本:在手機應用程式裡面讀取手機的儲存卡的資訊,按照檔案夾目錄一層層來展示儲存卡的檔案。
代碼清單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檔案代碼
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<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); } } } }}
程式的運行效果16.1所示。