SD 카드에 액세스

중요하지 않은 데이터는 옵션인 microSD 카드에 저장하고 액세스할 수 있습니다. 특히 내부 스토리지 용량이 제한적이고, SD 카드용 슬롯이 있는 저가대의 모바일 디바이스에 이 기능이 유용합니다.

대부분의 경우 앱이 SD 카드에 파일을 저장하고 이에 액세스할 수 있으려면 먼저 앱 매니페스트 파일에서 removableStorage 기능을 지정해야 합니다. 일반적으로 앱에서 저장하고 액세스하는 파일 형식을 처리할 수 있도록 등록도 해야 합니다.

다음 방법을 사용하여 선택적 SD 카드에 파일을 저장하고 이에 액세스할 수 있습니다.

SD 카드에서 액세스할 수 있는 항목과 액세스할 수 없는 항목

액세스할 수 있는 항목

  • 앱은 앱 매니페스트 파일에서 처리할 수 있도록 앱에서 등록한 파일 형식의 파일만 읽고 쓸 수 있습니다.
  • 앱은 폴더를 만들고 관리할 수도 있습니다.

액세스할 수 없는 항목

  • 앱은 시스템 폴더 및 해당 폴더에 포함된 파일을 보거나 이에 액세스할 수 없습니다.
  • 앱은 Hidden 특성으로 표시된 파일을 볼 수 없습니다. Hidden 특성은 일반적으로 실수로 데이터를 삭제할 위험을 줄이는 데 사용됩니다.
  • 앱은 KnownFolders.DocumentsLibrary를 사용하여 문서 라이브러리를 보거나 이에 액세스할 수 없습니다. 그러나 파일 시스템을 트래버스하여 SD 카드의 문서 라이브러리에 액세스할 수 있습니다.

보안 및 개인 정보 고려 사항

앱이 SD 카드의 전역 위치에 파일을 저장하는 경우 해당 파일은 암호화되지 않으므로 일반적으로 다른 앱에서 액세스할 수 있습니다.

  • 디바이스에 SD 카드가 있는 동안 동일한 파일 형식을 처리 하도록 등록된 다른 앱에서 파일에 액세스할 수 있습니다.
  • 디바이스에서 SD 카드를 제거하고 PC에서 열면 파일이 파일 탐색기에 표시되고 다른 앱에서 액세스할 수 있습니다.

그러나 SD 카드에 설치된 앱이 LocalFolder에 있는 파일을 저장하면 해당 파일은 암호화되고 다른 앱에서 액세스할 수 없습니다.

SD 카드의 파일에 액세스하기 위한 요구 사항

SD 카드의 파일에 액세스하려면 일반적으로 다음을 지정해야 합니다.

  1. 앱 매니페스트 파일에서 removableStorage 기능을 지정해야 합니다.
  2. 또한 액세스하려는 미디어 형식과 관련된 파일 확장명을 처리할 수 있도록 등록해야 합니다.

앞의 방법을 사용하면 knownFolders.MusicLibrary 같은 알려진 폴더를 참조하지 않고 SD 카드의 미디어 파일에 액세스하거나 미디어 라이브러리 폴더 외부에 저장된 미디어 파일에 액세스할 수도 있습니다.

알려진 폴더를 사용하여 미디어 라이브러리에 저장된 미디어 파일(음악, 사진 또는 동영상)에 액세스하려면 앱 매니페스트 파일에 관련 기능(musicLibrary, picturesLibrary 또는 videoLibrary)을 지정하기만 하면 됩니다. 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 카드 판독기가 포함된 판독기(예: 노트북 또는 PC 자체의 슬롯)인 경우 KnownFolders.RemovableDevices를 통해 액세스할 수 없습니다.

SD 카드의 내용 쿼리

SD 카드는 알려진 폴더로 인식되지 않고 KnownFolders의 위치를사용하여 쿼리할 수 없는 많은 폴더와 파일을 포함할 수 있습니다. 파일을 찾으려면 앱이 파일 시스템을 재귀적으로 트래버스하여 카드의 내용을 열거해야 합니다. SD 카드의 내용을 효율적으로 가져오기 위해 GetFilesAsync(CommonFileQuery.DefaultQuery)GetFoldersAsync(CommonFolderQuery.DefaultQuery)를 사용하세요.

백그라운드 스레드를 사용하여 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.
    }
}