您可以在選用的 microSD 記憶卡上儲存和存取非基本數據,特別是在具有有限內部儲存空間且具有 SD 記憶卡插槽的低成本行動裝置上。
在大部分情況下,您必須先在應用程式指令清單檔案中指定 抽取式Storage 功能,您的應用程式才能在 SD 記憶卡上儲存和存取檔案。 通常,您也必須註冊以處理應用程式儲存和存取的檔案類型。
您可以使用下列方法,在選擇性 SD 記憶卡上儲存和存取檔案:
- 檔案選擇器。
- Windows.Storage API。
您可以在 SD 記憶卡上存取和無法存取的內容
您可以存取的內容
- 您的應用程式只能讀取和寫入應用程式已註冊以在應用程式指令清單檔案中處理之檔案類型的檔案。
- 您的應用程式也可以建立和管理資料夾。
您無法存取的內容
- 您的應用程式看不到或存取系統資料夾及其所包含的檔案。
- 您的應用程式看不到以 Hidden 屬性標示的檔案。 Hidden 屬性通常用來降低不小心刪除數據的風險。
- 您的應用程式無法使用 KnownFolders.DocumentsLibrary 來查看或存取文檔庫。 不過,您可以透過瀏覽檔案系統來存取 SD 記憶卡上的文件夾。
安全性及隱私權考量
當應用程式將檔案儲存在 SD 記憶卡上的全域位置時,這些檔案不會加密,因此通常可供其他應用程式存取。
- 當 SD 記憶卡位於裝置中時,您的檔案可供已註冊以處理相同檔類型的其他應用程式存取。
- 從裝置移除 SD 記憶卡並從電腦開啟時,您的檔案會顯示在 [檔案總管] 中,並可供其他應用程式存取。
不過,當安裝在 SD 記憶卡上的應用程式在其 LocalFolder 中儲存盤案時,這些檔案會加密,而且無法供其他應用程式存取。
存取 SD 記憶卡上檔案的需求
若要存取 SD 記憶卡上的檔案,通常您必須指定下列事項。
- 您必須在應用程式指令清單檔案中指定 可移動式Storage 功能。
- 您也必須註冊,以處理與您想要存取的媒體類型相關聯的檔案副檔名。
使用上述方法也可以存取 SD 記憶卡上的媒體檔案,而不參考 KnownFolders.MusicLibrary 等已知資料夾,或存取儲存在媒體櫃資料夾外部的媒體檔案。
若要使用已知資料夾存取儲存在媒體媒體櫃中的媒體檔案—音樂、相片或影片],您只需要在應用程式指令清單檔案中指定相關聯的功能:musicLibrary、picturesLibrary 或 videoLibrary。 您不需要指定 卸除式儲存 能力。 如需詳細資訊,請參閱音樂、圖片及影片媒體櫃中的檔案和資料夾。
存取 SD 記憶卡上的檔案
取得 SD 記憶卡的參考
KnownFolders.RemovableDevices 資料夾是目前連接到裝置的一組可移動裝置的邏輯根目錄 StorageFolder。 如果 SD 記憶卡存在,KnownFolders.RemovableDevices 資料夾下方的第一個(也是唯一一個)StorageFolder 代表 SD 記憶卡。
使用如以下程式碼來判斷 SD 記憶卡是否存在,並取得其作為 StorageFolder 的參考。
using Windows.Storage;
// Get the logical root folder for all external storage devices.
StorageFolder externalDevices = Windows.Storage.KnownFolders.RemovableDevices;
// Get the first child folder, which represents the SD card.
StorageFolder sdCard = (await externalDevices.GetFoldersAsync()).FirstOrDefault();
if (sdCard != null)
{
// An SD card is present and the sdCard variable now contains a reference to it.
}
else
{
// No SD card is present.
}
備註
如果您的 SD 記憶卡讀取器是內建的讀取器(例如筆記型電腦或電腦本身的插槽),則可能無法透過 KnownFolders.RemovableDevices 存取。
查詢 SD 記憶卡的內容
SD 記憶卡可以包含許多無法辨識為已知資料夾的資料夾和檔案,而且無法使用 KnownFolders 的位置進行查詢。 若要尋找檔案,您的應用程式必須以遞歸方式周遊檔案系統來列舉卡片的內容。 使用 GetFilesAsync (CommonFileQuery.DefaultQuery) 和 GetFoldersAsync (CommonFolderQuery.DefaultQuery) 有效率地取得 SD 記憶卡的內容。
我們建議您使用背景執行緒來遍歷 SD 記憶卡。 SD 記憶卡可能包含數 GB 的數據。
您的應用程式也可以使用資料夾選擇器來要求用戶選擇特定資料夾。
當您使用衍生自 KnownFolders.RemovableDevices 的路徑存取 SD 記憶卡上的文件系統時,下列方法會以下列方式運作。
- GetFilesAsync 方法會傳回您已註冊以處理的檔案副檔名聯集,以及與您指定之任何媒體庫功能相關聯的檔案副檔名。
- 如果您尚未註冊來處理您嘗試存取之檔案的擴展名, GetFileFromPathAsync 方法會失敗。
識別個別的 SD 記憶卡
第一次掛接 SD 記憶卡時,作系統會產生卡片的唯一標識碼。 它會將此識別碼儲存在卡片根目錄的 WPSystem 資料夾中的檔案中。 應用程式可以使用此標識碼來判斷它是否辨識卡片。 如果應用程式辨識卡片,應用程式可能會延後先前完成的特定作業。 不過,自從應用程式上次存取卡片之後,卡片的內容可能會變更。
例如,請考慮索引電子書的應用程式。 如果應用程式先前已掃描整個 SD 記憶卡中的電子書檔案,並建立電子書的索引,則如果重新插入卡片,且應用程式辨識卡片,就可以立即顯示清單。 另外,它可以啟動低優先順序的背景線程來搜尋新的電子書。 這個系統可以處理當使用者嘗試存取已刪除的電子書時找不到過去存在的電子書的情況。
包含此標識碼的屬性名稱為 WindowsPhone.ExternalStorageId。
using Windows.Storage;
// Get the logical root folder for all external storage devices.
StorageFolder externalDevices = Windows.Storage.KnownFolders.RemovableDevices;
// Get the first child folder, which represents the SD card.
StorageFolder sdCard = (await externalDevices.GetFoldersAsync()).FirstOrDefault();
if (sdCard != null)
{
var allProperties = sdCard.Properties;
IEnumerable<string> propertiesToRetrieve = new List<string> { "WindowsPhone.ExternalStorageId" };
var storageIdProperties = await allProperties.RetrievePropertiesAsync(propertiesToRetrieve);
string cardId = (string)storageIdProperties["WindowsPhone.ExternalStorageId"];
if (...) // If cardID matches the cached ID of a recognized card.
{
// Card is recognized. Index contents opportunistically.
}
else
{
// Card is not recognized. Index contents immediately.
}
}