web-dev-qa-db-fra.com

Comment vérifier si un fichier existe dans une application du Windows Store?

Existe-t-il un autre moyen de vérifier si un fichier existe dans une application du Windows Store?

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

Selon la réponse acceptée dans ce post , il n'y a pas d'autre moyen pour le moment. Cependant, l'équipe File IO envisage de changer l'API pour qu'elle renvoie null au lieu de lever une exception.

Citation du post lié:

Actuellement, la seule façon de vérifier si un fichier existe est d'attraper l'exception FileNotFoundException. Comme cela a été souligné, avoir une vérification explicite et l'ouverture est une condition de concurrence et en tant que tel, je ne m'attends pas à ce qu'il y ait un fichier API ajouté. Je crois que l'équipe File IO (je ne fais pas partie de cette équipe, donc je ne suis pas sûr, mais c'est ce que j'ai entendu)) envisage de renvoyer cette API nulle au lieu de lancer si le fichier n'existe pas.

26
keyboardP

Cela peut être ancien, mais il semble qu'ils aient changé la façon dont ils veulent que vous abordiez cela.

Vous êtes censé tenter de créer le fichier, puis reculer si le fichier existe déjà. Ici est la documentation à ce sujet. Je mets à jour ceci parce que c'était le premier résultat sur ma recherche Google pour ce problème.

Donc, dans mon cas, je veux ouvrir un fichier ou le créer s'il n'existe pas. Je crée un fichier et l'ouvre s'il existe déjà. Ainsi:

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

Je suis tombé sur ce billet de blog de Shashank Yerramilli qui fournit une bien meilleure réponse.

J'ai testé cela pour Windows Phone 8 et cela fonctionne. Je ne l'ai pas testé sur Windows Store

Je copie la réponse ici

Pour Windows RT:

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

Pour Windows Phone 8

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

Vérifiez si un fichier existe dans Windows Phone 8 et WinRT sans exception

8
Jap

Microsoft a ajouté une nouvelle fonction à StorageFile dans Windows 8.1 pour permettre aux ingénieurs utilisateurs de déterminer si un fichier est accessible: IsAvailable

3
satur9nine

Vous pouvez utiliser l'ancien appel Win32 comme ceci pour tester si le répertoire existe ou non:

GetFileAttributesExW(path, GetFileExInfoStandard, &info);

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

Il fonctionne dans les applications Desktop et Metro: http://msdn.Microsoft.com/en-us/library/windows/desktop/aa364946%28v=vs.85%29.aspx

3
Michael Wildermuth

L'autre moyen de vérifier est d'obtenir les fichiers dans le dossier local

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

En utilisant cette méthode, puis en itérant sur tous les éléments de la collection et vérifiez sa disponibilité.

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

J'ai essayé d'écrire le mien en utilisant de vieilles astuces:

  1. GetFileAttributesEx () semble toujours se retrouver avec ERROR_ACCESS_DENIED si le fichier est sélectionné via FileOpenPicker;
  2. Idem pour FindFirstFileEx ();
  3. _stat () finit toujours par ENOENT lorsque le fichier est sélectionné via FileOpenPicker;
  4. CreateFile2 () avec l'option CREATE_NEW fonctionne - si le fichier existe, il échouera avec la valeur de retour INVALID_HANDLE_VALUE et la dernière erreur ERROR_FILE_EXISTS; si le fichier n'existe pas, vous devez vous rappeler de supprimer le fichier créé par la suite.

Dans l'ensemble, il vaut mieux s'en tenir à la méthode de gestion des exceptions.

1

8.1 a obtenu quelque chose comme ça, j'ai essayé que cela fonctionne.

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- plus de gestion des exceptions /

1
canbax

La documentation de Dry GetItemAsync dit: "Cet exemple montre comment vérifier l'existence d'un fichier." Il semble que cette API soit officiellement destinée à cet effet.

0
Thaine Norris