Come verificare se il file esiste in un’app di Windows Store?

C’è un altro modo per verificare se un file esiste in un’app di Windows Store?

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

Secondo la risposta accettata in questo post , non c’è altro modo al momento. Tuttavia, il team di I / O file sta considerando di modificare l’API in modo che restituisca un valore nullo invece di generare un’eccezione.

Citazione dal post collegato:

Attualmente l’unico modo per verificare se esiste un file è catturare FileNotFoundException. Come è stato sottolineato avendo un controllo esplicito e l’apertura è una condizione di gara e come tale non mi aspetto che ci sia alcun file esiste API aggiunto. Credo che il team File IO (non sono in quella squadra, quindi non lo so per certo, ma questo è quello che ho sentito) sta considerando di avere questo ritorno API nullo invece di lanciare se il file non esiste.

Questo potrebbe essere vecchio, ma sembra che abbiano cambiato il modo in cui vogliono che tu ti avvicini a questo.

Dovresti tentare di creare il file, quindi tornare indietro se il file esiste già. Ecco la documentazione su di esso. Sto aggiornando questo perché questo è stato il primo risultato sulla mia ricerca su Google per questo problema.

Quindi, nel mio caso, voglio aprire un file o crearlo se non esiste. Quello che faccio è creare un file e aprirlo se già esiste. Così:

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

Sono incappato in questo post sul blog di Shashank Yerramilli che fornisce una risposta molto migliore.

Ho provato questo per Windows Phone 8 e funziona. Non l’ho testato su Windows Store però

Sto copiando la risposta qui

Per l’app Windows RT:

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

Per Windows Phone 8

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

Controlla se esiste un file in Windows Phone 8 e WinRT senza eccezioni

È ansible utilizzare la vecchia chiamata Win32 in questo modo per verificare se la directory esiste o no:

 GetFileAttributesExW(path, GetFileExInfoStandard, &info); return (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? false: true; 

Funziona nelle app desktop e Metro: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364946%28v=vs.85%29.aspx

Microsoft ha aggiunto una nuova funzione a StorageFile in Windows 8.1 per consentire ai tecnici degli utenti di determinare se è ansible accedere a un file: IsAvailable

L’altro mezzo per controllare è ottenere i file nella cartella locale

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

Utilizzare questo metodo e quindi iterare su tutti gli elementi della raccolta e verificarne la disponibilità.

Ho provato a scrivere il mio usando vecchi trucchi:

  1. GetFileAttributesEx () sembra sempre finire con ERROR_ACCESS_DENIED se il file è stato selezionato tramite FileOpenPicker;
  2. Idem per FindFirstFileEx ();
  3. _stat () finisce sempre con ENOENT quando il file è selezionato tramite FileOpenPicker;
  4. CreateFile2 () con l’opzione CREATE_NEW funziona: se il file esiste, fallirà con il valore restituito INVALID_HANDLE_VALUE e l’ultimo errore ERROR_FILE_EXISTS; se il file non esiste devi ricordare di cancellare il file creato in seguito.

Tutto sumto, è meglio attenersi al metodo di gestione delle eccezioni.

8,1 ottenuto qualcosa di simile, ho provato ha funzionato.

 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- gestione /

  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 

La documentazione di TryGetItemAsync dice: “Questo esempio mostra come verificare l’esistenza di un file.” Sembra che questa API sia ufficialmente intesa per questo scopo.