(Risposta ricostruire per essere più chiari)
Se aveva dichiarato in package.appxmanifest
di file:
Music Library
capacità in Capabilities
File Type Association
in Dichiarazioni (non sono sicuro se ciò è necessario se si accede solo alla Libreria musicale)
allora si sarà in grado di recuperare i file dalla cartella Music Library
come questo:
StorageFolder folder = KnownFolders.MusicLibrary;
// below code will work unless 'fileName.mp3' is in
// your Music folder either on phone or SD card
StorageFile file = await folder.GetFileAsync("fileName.mp3");
// you can access them also with path, but in this case
// also Folders must be in Music folder
string path = @"Test\ccc.mp3";
StorageFile file = await folder.GetFileAsync(path);
Riassumendo si sarà in grado di Aceess da KnownFolders.MusicLibrary
solo ai file che sono o sul telefono o nella scheda SD, ma nella cartella Musica - i loro percorsi saranno quindi:
C: \ Data \ Users \ Public \ Musica \ test.mp3 - per il telefono
D: Musica \ test \ test2.mp3 \ - per SD card
Ricordate che l'accesso da StorageFolder.GetFileAsync() funziona relativa al StorageFolder (funzionerà anche con il percorso completo, vedi osservazione sotto):
Il nome (o il percorso relativo alla cartella corrente) del file recuperare.
In questo caso per ottenere i file di cui sopra si intende utilizzare nomi di file come: test.mp3
e Test\test2.mp3
.
È non sarà in grado di ottenere altri file come D:\xxx.mp3
- non è nella Music Library - è su scheda SD, se si vuole accedervi dovrete farlo da KnownFolders.RemovableDevices - quando hanno aggiunto le funzionalità richieste, quindi dovresti essere in grado di accedervi tramite fullpath. Ma anche please remember about the remark:
Non fare affidamento su questa proprietà per accedere a un file perché alcuni file potrebbero non avere percorsi del file system. Ad esempio, se il file è supportato da un URI o è stato selezionato utilizzando il selettore di file, non è garantito che il file abbia un percorso del file system.
Nella nostra discussione spiegata che si sta utilizzando CommonFileQuery.OrderByName
per ottenere i file. Come ho controllato lì (IMO) potrebbe essere un piccolo bug - nella descrizione VS dice che:
I risultati delle query per le query profondi comprendono tutti i file in tutte le sottocartelle della cartella interrogato e le ordina in base ai metadati specificati.
Esecuzione di una pice di codice:
// a method to retrieve files from Musiic Library recursively
private async Task RetriveFilesInFolders(List<StorageFile> list, StorageFolder parent)
{
foreach (var item in await parent.GetFilesAsync()) list.Add(item);
foreach (var item in await parent.GetFoldersAsync()) await RetriveFilesInFolders(list, item);
}
// then I've used it like this:
StorageFolder folder = KnownFolders.MusicLibrary;
List<StorageFile> listOfFiles = new List<StorageFile>();
await RetriveFilesInFolders(listOfFiles, folder);
// as a result of above code I have a List of 5 files that are in Music Library
List<IStorageItem> filesFolders = (await folder.GetItemsAsync()).ToList();
List<StorageFile> items = (await folder.GetFilesAsync(CommonFileQuery.OrderByName)).ToList();
// as a result here I've 14 files that are in Music Library and SD card, and Phone
ha dato resuls:
- nel primo caso 5 file che si trovano di fatto nella cartella Musica e relative sottocartelle,
- in seconda caso - 14 file presenti in: libreria musicale, scheda SD e telefono
Puoi facilmente guardare lo Path
in modalità di debug e vedrai che alcuni file nel secondo metodo hanno D:\file.mp3
e così via - non sono nella libreria musicale - quindi non sarai in grado di ottenerli per KnownFolders.MusicLibrary
. Se si desidera ottenere loro allora si dovrà utilizzare altri KnownFolders - in questo caso la scheda SD:
StorageFolder externalDevices = Windows.Storage.KnownFolders.RemovableDevices;
StorageFolder sdCard = (await externalDevices.GetFoldersAsync()).FirstOrDefault();
StorageFile file = await sdCard.GetFileAsync("xyz.mp3"); // for D:\xyz.mp3
StorageFile file = await sdCard.GetFileAsync("XYZ\xyz.mp3"); // for D:\XYZ\xyz.mp3
GetFileFromPathAsync non garantisce il mantenimento dell'accesso ai file da un selettore su Windows Phone 8.1. L'accesso negato è il risultato previsto. Per mantenere l'accesso sarà necessario utilizzare lo spazio dei nomi Windows.Storage.AccessCache. Vedi la mia risposta per un modo per mantenere l'accesso a un file. – Adam