访问 SD 卡

可以在可选的 microSD 卡上存储和访问非基本数据,尤其是在具有有限内部存储且具有 SD 卡槽的低成本移动设备上。

在大多数情况下,你必须在应用清单文件中配置 可移动存储 功能,这样应用才能够在 SD 卡上存储和访问文件。 通常,还必须注册才能处理应用存储和访问的文件类型。

可以使用以下方法在可选的 SD 卡上存储和访问文件:

可以在 SD 卡上访问和无法访问的内容

可以访问的内容

  • 你的应用只能读取和写入在应用清单文件中注册以处理的文件类型。
  • 你的应用还可以创建和管理文件夹。

无法访问的内容

  • 你的应用无法查看或访问系统文件夹及其包含的文件。
  • 你的应用看不到使用 Hidden 属性标记的文件。 Hidden 属性通常用于降低意外删除数据的风险。
  • 你的应用无法使用 KnownFolders.DocumentsLibrary查看或访问文档库。 但是,可以通过遍历文件系统来访问 SD 卡上的文档库。

安全和隐私注意事项

当应用将文件保存在 SD 卡上的全局位置时,这些文件不会加密,因此它们通常可供其他应用访问。

  • 当 SD 卡位于设备中时,你的文件可供已注册以处理相同文件类型的其他应用访问。
  • 从设备中删除 SD 卡并从电脑打开时,文件在文件资源管理器中可见,可供其他应用访问。

当安装在 SD 卡上的应用将文件保存在其 LocalFolder中时,这些文件会加密,并且无法访问其他应用。

访问 SD 卡上的文件的要求

若要访问 SD 卡上的文件,通常需要指定以下事项。

  1. 必须在应用清单文件中指定 removableStorage 这一功能。
  2. 还必须注册才能处理与要访问的媒体类型关联的文件扩展名。

使用上述方法还可以访问 SD 卡上的媒体文件,而无需引用已知文件夹(如 KnownFolders.MusicLibrary)或访问存储在媒体库文件夹外部的媒体文件。

若要使用已知文件夹访问媒体库中存储的媒体文件(音乐、照片或视频),只需在应用清单文件中指定关联的功能,musicLibrarypicturesLibraryvideoLibrary。 无需指定 removableStorage 功能。 有关详细信息,请参阅音乐、图片和视频库中 文件和文件夹

访问 SD 卡上的文件

获取对 SD 卡的引用

KnownFolders.RemovableDevices 文件夹是当前连接到设备的一组可移动设备的逻辑根 StorageFolder。 如果存在 SD 卡,则 StorageFolder 文件夹作为 KnownFolders.RemovableDevices 文件夹下的第一个(也是唯一的)存储文件夹,表示 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 卡可能包含数千兆字节的数据。

你的应用还可以要求用户使用文件夹选取器选择特定文件夹。

使用派生自 KnownFolders.RemovableDevices的路径访问 SD 卡上的文件系统时,以下方法的行为方式如下。

  • GetFilesAsync 方法返回你已注册的文件扩展名与任何你指定的媒体库功能关联的文件扩展名的合集。
  • 如果尚未注册以处理尝试访问的文件的文件扩展名,GetFileFromPathAsync 方法将失败。

标识单个 SD 卡

首次装载 SD 卡时,操作系统将为该卡生成唯一标识符。 它将此 ID 存储在卡片根目录的 WPSystem 文件夹中的文件中。 应用可以使用此 ID 来确定它是否识别卡片。 如果应用识别卡,应用可能能够推迟之前完成的某些操作。 但是,自从应用程序上次访问卡后,卡的内容可能已经更改。

例如,请考虑为电子书编制索引的应用。 如果应用以前扫描了整个 SD 卡的电子书文件并创建了电子书的索引,则当重新插入卡片并且应用识别卡时,它可以立即显示列表。 另外,它可以启动低优先级后台线程来搜索新电子书。 它还可以在用户尝试访问已删除的电子书时,处理找不到之前存在的电子书的情况。

包含此 ID 的属性名称是 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.
    }
}