次の方法で共有


SD カードにアクセスする

特に、内部ストレージが制限され、SD カード用のスロットがある低コストのモバイル デバイスでは、必須ではないデータをオプションの microSD カードに格納してアクセスできます。

ほとんどの場合、アプリが SD カードにファイルを格納してアクセスする前に、アプリ マニフェスト ファイルに removableStorage 機能を指定する必要があります。 通常は、アプリが格納してアクセスするファイルの種類を処理するために登録する必要もあります。

次の方法を使用して、オプションの SD カードにファイルを保存してアクセスできます。

SD カードでアクセスできることとアクセスできないもの

アクセスできる内容

  • アプリは、アプリ マニフェスト ファイルで処理するためにアプリが登録したファイルの種類のファイルのみを読み書きできます。
  • アプリでは、フォルダーを作成および管理することもできます。

アクセスできない内容

  • アプリでは、システム フォルダーとそのフォルダーに含まれるファイルを表示またはアクセスできません。
  • アプリでは、Hidden 属性でマークされたファイルを表示できません。 通常、Hidden 属性は、誤ってデータを削除するリスクを軽減するために使用されます。
  • アプリでは KnownFolders.DocumentsLibraryを使用して、ドキュメント ライブラリを見たりアクセスしたりすることはできません。 ただし、ファイル システムを走査することで、SD カード上のドキュメント ライブラリにアクセスできます。

セキュリティとプライバシーに関する考慮事項

アプリが SD カード上のグローバルな場所にファイルを保存する場合、それらのファイルは暗号化されないため、通常は他のアプリからアクセスできます。

  • SD カードがデバイス内にある間は、同じファイルの種類を処理するために登録されている他のアプリからファイルにアクセスできます。
  • SD カードがデバイスから削除され、PC から開かれると、ファイルはエクスプローラーに表示され、他のアプリからアクセスできます。

ただし、SD カードにインストールされたアプリがファイルを LocalFolderに保存すると、それらのファイルは暗号化され、他のアプリからはアクセスできません。

SD カード上のファイルにアクセスするための要件

SD カード上のファイルにアクセスするには、通常、次のものを指定する必要があります。

  1. アプリ マニフェスト ファイルで、リムーバブルStorage 機能を指定する必要があります。
  2. また、アクセスするメディアの種類に関連付けられているファイル拡張子を処理するために登録する必要があります。

また、上記の方法を使用して、KnownFolders.MusicLibraryなどの既知のフォルダーを参照せずに SD カード上のメディア ファイルにアクセスしたり、メディア ライブラリ フォルダーの外部に格納されているメディア ファイルにアクセスしたりすることもできます。

既知のフォルダーを使用してメディア ライブラリ (音楽、写真、ビデオ) に格納されているメディア ファイルにアクセスするには、musicLibrary、picturesLibrary、または videoLibrary、アプリ マニフェスト ファイル内の関連する機能のみを指定する必要があります。 リムーバブルStorage 機能を指定する必要はありません。 詳細については、「音楽、画像、ビデオライブラリの ファイルとフォルダー」を参照してください。

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 や PC 自体のスロットなど) の場合、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.
    }
}