it-swarm.dev

Wie überprüfe ich, ob eine Datei in einer Windows Store App vorhanden ist?

Gibt es eine andere Möglichkeit, um zu überprüfen, ob eine Datei in einer Windows Store-App vorhanden ist?

try
{
    var file = await ApplicationData.Current.LocalFolder.GetFileAsync("Test.xml");
    //no exception means file exists
}
catch (FileNotFoundException ex)
{ 
    //find out through exception 
}
48
Haris Hasan

Laut der akzeptierten Antwort in dieser Post gibt es im Moment keinen anderen Weg. Das Team von File IO erwägt jedoch, die API so zu ändern, dass sie null zurückgibt, anstatt eine Ausnahme auszulösen.

Zitat aus dem verlinkten Beitrag:

Derzeit können Sie nur prüfen, ob eine Datei vorhanden ist, indem Sie die FileNotFoundException abfangen. Wie bereits erwähnt, ist eine explizite Überprüfung und die Eröffnung eine Rennbedingung. Daher erwarte ich nicht, dass APIs hinzugefügt wurden, die Dateien enthalten. Ich glaube, das File IO Team (ich bin nicht in diesem Team, also weiß ich es nicht genau, aber das habe ich gehört) erwägt, dass diese API null zurückgibt, anstatt zu werfen wenn die Datei nicht existiert.

26
keyboardP

Das mag alt sein, aber es sieht so aus, als hätten sie geändert, wie Sie das angehen sollen.

Sie sollten versuchen, die Datei zu erstellen, und dann zurückkehren, wenn die Datei bereits vorhanden ist. hier ist die Dokumentation dazu. Ich aktualisiere dies, da dies das erste Ergebnis meiner Google-Suche für dieses Problem war.

In meinem Fall möchte ich eine Datei öffnen oder erstellen, wenn sie nicht vorhanden ist. Ich erstelle eine Datei und öffne sie, falls sie bereits existiert. Wie so:

save = await dir.CreateFileAsync(myFile, CreationCollisionOption.OpenIfExists);
13
Billdr

Ich bin auf diesen Blog-Beitrag von Shashank Yerramilli gestoßen, der eine viel bessere Antwort liefert.

Ich habe dies für Windows Phone 8 getestet und es funktioniert. Habe es aber nicht im Windows Store getestet

Ich kopiere die Antwort hier

Für Windows RT App:

public async Task<bool> isFilePresent(string fileName)
 {
    var item = await ApplicationData.Current.LocalFolder.TryGetItemAsync(fileName);
    return item != null;
 }

Für Windows Phone 8

 public bool IsFilePresent(string fileName)
 {
     return System.IO.File.Exists(string.Format(@"{0}\{1}", ApplicationData.Current.LocalFolder.Path, fileName);
 }

Überprüfen Sie ausnahmslos, ob eine Datei in Windows Phone 8 und WinRT vorhanden ist

8
Jap

Microsoft hat StorageFile in Windows 8.1 um eine neue Funktion erweitert, mit der Anwender feststellen können, ob auf eine Datei zugegriffen werden kann: IsAvailable

3
satur9nine

Sie können den alten Win32-Aufruf wie folgt verwenden, um zu testen, ob ein Verzeichnis vorhanden ist oder nicht:

GetFileAttributesExW(path, GetFileExInfoStandard, &info);

return (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? false: true;

Es funktioniert in Desktop- und Metro-Apps: http://msdn.Microsoft.com/en-us/library/windows/desktop/aa364946%28v=vs.85%29.aspx

3

Die andere Möglichkeit zur Überprüfung besteht darin, Dateien im lokalen Ordner abzurufen

    var collection =  ApplicationData.Current.LocalFolder.GetFilesAsync() 

Verwenden Sie diese Methode, und wiederholen Sie dann alle Elemente in der Auflistung, und überprüfen Sie die Verfügbarkeit.

2
Anobik
    Dim myPath As StorageFolder
    If (From i In Await KnownFolders.MusicLibrary.GetFoldersAsync() Where i.Name = "PodBong").Count = 1 Then
        myPath = Await KnownFolders.MusicLibrary.GetFolderAsync("PodBong")
    Else
        myPath = Await KnownFolders.MusicLibrary.CreateFolderAsync("PodBong")

    End If
1
HippieGeek

Ich habe versucht, meine eigenen mit alten Tricks zu schreiben:

  1. GetFileAttributesEx () scheint immer mit ERROR_ACCESS_DENIED zu enden, wenn die Datei über FileOpenPicker ausgewählt wird.
  2. Das Gleiche gilt für FindFirstFileEx ();
  3. _stat () endet immer mit ENOENT, wenn die Datei über FileOpenPicker ausgewählt wird.
  4. CreateFile2 () mit der Option CREATE_NEW funktioniert - wenn eine Datei vorhanden ist, schlägt sie mit dem Rückgabewert INVALID_HANDLE_VALUE und dem letzten Fehler ERROR_FILE_EXISTS fehl. Wenn die Datei nicht existiert, müssen Sie daran denken, die erstellte Datei anschließend zu löschen.

Alles in allem ist es besser, sich an die Ausnahmebehandlungsmethode zu halten.

1

8.1 hat so etwas, ich habe versucht, es hat funktioniert.

var folder = ApplicationData.Current.LocalFolder;
var file = await folder.TryGetItemAsync("mytext.txt") as IStorageFile;

if (file == null)
{
   //do what you want
}
else
{
   //do what you want
}

http://marcominerva.wordpress.com/2013/11/19/how-to-check-if-a-file-exists-in-a-windows-8-1-store-apps-no- more-exception-handling /

1
canbax

In der Dokumentation zu Try GetItemAsync heißt es: "In diesem Beispiel wird gezeigt, wie auf das Vorhandensein einer Datei geprüft wird." Es scheint, dass diese API offiziell dazu gedacht ist, diesen Zweck zu erfüllen.

0
Thaine Norris