Ich lasse meinen Nutzern Dateien aus der Musikbibliothek auswählen. Danach speichere ich den Pfad der ausgewählten Dateien lokal. Jetzt ist mein Problem, wie bekomme ich programmatisch Zugriff auf die Dateien von diesen Pfaden? Hier sind ein paar Dinge, die ich versucht habe.
Sagen Sie, mein Pfadname ist D: \ Xyz \ abc.mp3
StorageFolder S = KnownFolders.MusicLibrary;
Alternative 1:
StorageFile MyFile = erwartet S.GetFileAsync ("abc.mp3"); // Datei nicht gefunden Fehler
// Ich denke, das funktioniert nicht, weil die GetFileAsync-Methode nur Dateien aus dem aktuellen Ordner
abrufen kannAlternative 2:
S = erwartet S.GetFolderAsync ("Xyz"); // Nach dem ich GetFileAsync geplant habe. Aber dies gibt auch einen Ordner nicht gefunden Fehler.
Und schließlich habe ich versucht S = erwarten S.GetFolderAsync ("D");
Jede Hilfe, wie ich Zugriff auf die Datei bekomme oder sogar einen alternativen Weg, um mein Ziel zu erreichen, wäre fantastisch!
P.S: StorageFile.GetFileFromPathAsync ("D: \ Xyz \ abc.mp3") sagt, dass ich keine Zugriffsberechtigung habe.
(Beantworte die Wiederherstellung, um klarer zu werden)
Wenn Sie in package.appxmanifest
file deklariert haben:
Music Library
Fähigkeit in Fähigkeiten
File Type Association
in Deklarationen (Ich bin mir nicht sicher, ob dies erforderlich ist, wenn Sie nur auf die Musikbibliothek zugreifen) Dann können Sie Dateien aus Music Library
Ordner wie folgt abrufen:
Um es zusammenzufassen: Sie können KnownFolders.MusicLibrary
nur für Dateien freigeben, die sich entweder auf dem Telefon oder der SD-Karte befinden, aber im Musikordner - ihre Pfade sind dann:
C: \ Daten \ Benutzer \ Öffentlich \ Musik \ test.mp3 - für Telefon
D: \ Musik \ Test \ test2.mp3 - für SD-Karte
Denken Sie daran, dass der Zugriff über StorageFolder.GetFileAsync () möglich ist funktioniert relativ zum StorageFolder (es funktioniert auch mit vollem Pfad, siehe Bemerkung unten):
Der Name (oder Pfad relativ zum aktuellen Ordner) der abzurufenden Datei.
In diesem Fall werden die Dateinamen wie folgt verwendet: test.mp3
und Test\test2.mp3
.
Sie können keine anderen Dateien wie D:\xxx.mp3
abrufen - sie befinden sich nicht in der Musikbibliothek - sie befinden sich auf der SD-Karte, wenn Sie darauf zugreifen möchten, müssen Sie dies tun es von KnownFolders.RemovableDevices - wenn Sie die erforderlichen Funktionen hinzugefügt haben, dann Sie sollten in der Lage sein, über Vollpfad darauf zuzugreifen. Beachten Sie jedoch auch die Anmerkung
Verlassen Sie sich nicht auf diese Eigenschaft, um auf eine Datei zuzugreifen, da einige Dateien möglicherweise keine Dateisystempfade haben. Wenn beispielsweise die Datei von einem URI gesichert wird oder mit der Dateiauswahl ausgewählt wurde, ist nicht garantiert, dass die Datei über einen Dateisystempfad verfügt.
In unserer Diskussion haben wir herausgefunden, dass Sie CommonFileQuery.OrderByName
verwenden, um Dateien zu erhalten. Wie ich dort nachgesehen habe (IMO) könnte das ein kleiner Bug sein - in der VS-Beschreibung heißt das:
Abfrageergebnisse für tiefe Abfragen umfassen alle Dateien in allen Unterordnern des abgefragten Ordners und sortieren sie basierend auf den angegebenen Metadaten.
Ausführen eines Stück Code:
%Vor%hat resuls gegeben:
Sie können sich einfach den Path
im Debug-Modus ansehen und Sie werden sehen, dass einige der Dateien in der zweiten Methode D:\file.mp3
haben und so weiter - sie sind nicht in der Musikbibliothek - also werden Sie nicht in der Lage sein Erhalte sie nach KnownFolders.MusicLibrary
. Wenn Sie sie bekommen wollen, müssen Sie andere KnownFolders verwenden - in diesem Fall SD-Karte:
Stellen Sie zunächst sicher, dass Sie über die richtigen Funktionen verfügen. Der Fehler, den Sie erhalten, ist der, den Sie sehen würden, wenn Sie nicht die richtige CAP_ID deklariert haben. Hier ist ein Screenshot:
In Bezug auf Dateipfade müssen Sie, abhängig davon, wo die Datei gespeichert ist, möglicherweise den doppelten Schrägstrich verwenden. Ich hatte ein ähnliches Problem, das ich mit folgendem Ansatz gelöst habe:
"isostore: shared \\ Ordnername \\ NameOfFile.mp3"
Sie können den gesamten Prozess in meine SO Post hier .
Sie sollten den Zugriffscache um den Zugriff auf die Dateien anstelle der Pfade zu speichern. Auf diese Weise können Sie StorageFile-Objekte abrufen, mit denen Sie sofort arbeiten können, und Sie können mit einigen Szenarios umgehen, die Dateien betreffen, die verschoben werden.
Um eine Datei im Zugriffscache zu speichern
%Vor%Sie speichern das Token dann wo. Um die Datei aus dem Cache zurück zu bekommen:
%Vor%Wenn Sie nur den Pfad speichern, werden Probleme mit Laufwerksbuchstaben usw. angezeigt. Dies stellt sicher, dass Ihre App sie erhalten kann, wenn die Datei noch verfügbar ist.
Tags und Links windows windows-phone-8.1 windows-phone