存取 SD 記憶卡

您可以在選用的 microSD 記憶卡上儲存和存取非必要的資料,尤其是內部儲存空間有限且具備 SD 記憶卡插槽的低價行動裝置。

在大部分情況下,您必須先在應用程式資訊清單檔案中指定 removableStorage 功能,您的應用程式才能在 SD 卡上儲存和存取檔案。 通常,您也必須註冊以處理應用程式儲存和存取的檔案類型。

您可以使用下列方法,在選用的 SD 卡上儲存和存取檔案:

您可以和無法在 SD 卡上存取的內容

您可以存取的內容

  • 您的應用程式只能讀取和寫入應用程式已註冊以在應用程式資訊清單檔案中處理的檔案類型檔案。
  • 您的應用程式也可以建立和管理資料夾。

您無法存取的內容

  • 您的應用程式看不到或存取系統資料夾及其包含的檔案。
  • 您的應用程式看不到使用隱藏屬性標示的檔案。 隱藏屬性通常用來降低不慎刪除資料的風險。
  • 您的應用程式無法使用 KnownFolders.DocumentsLibrary 來查看或存取文件庫。 不過,您可以透過周遊檔案系統來存取 SD 卡上的文件庫。

安全性和隱私權考量

當應用程式將檔案儲存在 SD 卡上的全域位置時,這些檔案不會加密,因此通常可供其他應用程式存取。

  • 當 SD 卡在裝置中時,您的檔案會可供已註冊可處理相同檔案類型的其他應用程式存取。
  • 從裝置移除 SD 卡並從電腦開啟時,您的檔案會顯示在檔案總管中,並可供其他應用程式存取。

不過,當安裝在 SD 卡上的應用程式將檔案儲存在其 LocalFolder 時,這些檔案會加密,且無法供其他應用程式存取。

存取 SD 卡上檔案的需求

若要存取 SD 卡上的檔案,通常您必須指定下列項目。

  1. 您必須在應用程式資訊清單檔案中指定 removableStorage 功能。
  2. 您也必須註冊以處理與您想要存取的媒體類型相關聯的副檔名。

使用前述方法也可以存取 SD 卡上的媒體檔案,而不需參考 KnownFolders.MusicLibrary 等已知資料夾,或存取儲存在媒體櫃資料夾外部的媒體檔案。

若要使用已知資料夾存取儲存在媒體櫃中的媒體檔案,即音樂、相片或影片,您只需要在應用程式資訊清單檔案中指定相關聯的功能:musicLibrarypicturesLibraryvideoLibrary。 您不需要指定 removableStorage 功能。 如需詳細資訊,請參閱音樂、圖片及影片媒體櫃中的檔案和資料夾

存取 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.
    }
}