Поделиться через


Доступ к SD-карте

Вы можете хранить и получать доступ к несущественным данным на дополнительной карте microSD, особенно на бюджетных мобильных устройствах с ограниченной внутренней памятью и слотом для SD-карты.

В большинстве случаев необходимо указать возможность съемных устройств хранения в файле манифеста приложения, прежде чем приложение сможет сохранить файлы и получить доступ к ним на SD-карте. Обычно вам также нужно зарегистрироваться для обработки типов файлов, которые ваше приложение сохраняет и к которым получает доступ.

Вы можете хранить и получать доступ к файлам на необязательной SD-карте с помощью следующих методов:

Какие данные на SD-карте доступны вам, а какие нет

Доступ к чему можно получить

  • Приложение может только считывать и записывать файлы типов файлов, зарегистрированных приложением для обработки в файле манифеста приложения.
  • Приложение также может создавать папки и управлять ими.

К чему вы не можете получить доступ

  • Приложение не может видеть системные папки и файлы, содержащиеся в них, или получать доступ к ним.
  • Приложение не может видеть файлы, помеченные атрибутом Hidden. Скрытый атрибут обычно используется для уменьшения риска случайного удаления данных.
  • Приложение не может видеть или получать доступ к библиотеке документов с помощью KnownFolders.DocumentsLibrary. Однако вы можете получить доступ к библиотеке документов на SD-карте, выполнив обход файловой системы.

Вопросы безопасности и конфиденциальности

Когда приложение сохраняет файлы в глобальном расположении на SD-карте, эти файлы не шифруются, поэтому они обычно доступны другим приложениям.

  • Хотя SD-карта находится на устройстве, файлы доступны другим приложениям, зарегистрированным для обработки того же типа файлов.
  • Когда SD-карта удаляется с устройства и открывается с компьютера, файлы отображаются в проводнике и доступны другим приложениям.

Если приложение, установленное на SD-карте, сохраняет файлы в LocalFolder, однако эти файлы шифруются и недоступны для других приложений.

Требования к доступу к файлам на SD-карте

Для доступа к файлам на SD-карте обычно необходимо указать следующие моменты.

  1. Необходимо указать возможность removableStorage в файле манифеста приложения.
  2. Кроме того, необходимо зарегистрировать расширения файлов, связанные с типом носителя, к которому требуется получить доступ.

Используйте предыдущий метод, чтобы также получить доступ к файлам мультимедиа на SD-карте без ссылки на известную папку, например KnownFolders.MusicLibrary, или получить доступ к файлам мультимедиа, которые хранятся вне папок библиотеки мультимедиа.

Чтобы получить доступ к файлам мультимедиа, хранящимся в библиотеках мультимедиа (музыка, фотографии или видео), с помощью известных папок необходимо указать только связанную возможность в файле манифеста приложения—musicLibrary, рисункиLibraryили видеоLibrary. Вам не нужно указывать возможность съемного хранилища. Дополнительные сведения см. в разделе "Файлы и папки" в библиотеках "Музыка", "Рисунки" и "Видео".

Доступ к файлам на 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-карта может содержать много гигабайт данных.

Приложению также может потребоваться, чтобы пользователь выбрал определенные папки с помощью средства выбора папок.

При доступе к файловой системе на SD-карте с путем, производным от KnownFolders.RemovableDevices, следующие методы ведут себя следующим образом.

  • Метод 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.
    }
}