Windows 8 et l’Advanced Query Syntax… ou comment tester l’existence d’un fichier

Mais qu’est-ce que l’AQS (Advanced Query Syntax) ?

L’AQS est une syntaxe permettant d’effectuer des recherches avancées sur le système de fichiers. Cette syntaxe a été introduite à partir de Windows 7.

Lorsque l’on effectue une recherche depuis le menu démarrer dans Windows 7, ou depuis le Charm de recherche sous Windows 8, nous pouvons utiliser l’AQS pour rechercher dans les fichiers indexés par Windows.

L’AQS fonctionne aussi bien avec les propriétés système des fichiers, que des mots clés (dans la langue de l’UI du système). Par exemple pour rechercher tous les fichiers appartenant à un auteur spécifique, nous pouvons utiliser les 3 filtres suivants :

  • system.author:benoit
  • authors:benoit
  • author:benoit


image

Tester l’existence d’un fichier avec l’AQS

Pour connaitre l’existence d’un fichier en Windows 8 il n’existe que des méthodes “alternatives”. En fait avec les API de WinRT il n’est pas possible de faire appel à File.Exist(string). La classe File est une classe .Net et n’est pas accessible en WinRT.

Richard C. nous expose sur son blog certaines méthodes alternatives permettant de tester l’existence d’un fichier.

Les 3 méthodes décrite dans ce post sont les suivantes :

  • Méthode 1 : Parcourir tous les fichiers d’un répertoire à la recherche d’un fichier spécifique
  • Méthode 2 : Ouvrir le fichier pour lecture. Cette méthode déclenche une exception dans le cas où le fichier n’existe pas
  • Méthode 3 : utiliser les API Win32

La méthode 1 n’est pas à mon gout, surtout lorsque l’on effectue souvent cette opération. Et plus il y a de fichiers dans le répertoire et moins ce sera performant.

Comme Richard, je qualifierai la méthode 2 de méthode brutale, puisque nous forçons le système à déclencher une exception en accédant à un fichier inexistant. A éviter si vous l’utiliser très souvent…

Et pour ma part je qualifierai la 3ème méthode de méthode barbue… C’est bien évidemment la meilleure méthode en terme d’efficacité et de performance, mais la plus complexe à développer (bien qu’il suffise de faire un copier/coller ;))

En utilisant l’AQS nous pouvons ajouter une méthode alternative pour rechercher l’existence d’un fichier, plus efficace que la 1ère méthode, non brutale comparée à la 2ème méthode, et plus simple à développer et à réécrire que la méthode barbue.

Avec l’AQS il est possible d’effectuer une recherche sur le nom du fichier en utilisant la propriété system.filename ou tout simplement le mot clé filename. Avec ceci, nous pouvons écrire la méthode FileExist comme suit :

  1. public async static Task<bool> FileExist(string filePath)
  2. {
  3.     string fileName = Path.GetFileName(filePath);
  4.     string directoryPath = Path.GetDirectoryName(filePath);
  5.     var storageFolder = await Windows.Storage.StorageFolder.GetFolderFromPathAsync(directoryPath);
  6.     var queryOpt = new QueryOptions();
  7.     queryOpt.ApplicationSearchFilter = « system.filename: » » + fileName + «  » »;
  8.     queryOpt.FolderDepth = FolderDepth.Shallow;
  9.     queryOpt.IndexerOption = IndexerOption.UseIndexerWhenAvailable;
  10.     var queryFile = storageFolder.CreateFileQueryWithOptions(queryOpt);
  11.     return  (await queryFile.GetFilesAsync()).Count > 0;
  12. }

 

Dans cet exemple de code nous utilisons la classe StorageFolder pour retrouver une instance vers le répertoire devant contenir le fichier rechercher. Puis nous utilisons un objet de type QueryOptions associé à la méthode CreateFileQueryWithOptions, qui va nous permettre de rechercher des fichiers selon certains critères.

Pour utiliser l’AQS il suffit de préciser le filtre sur le nom du fichier au niveau de la propriété ApplicationSearchFilter des options de recherche.

Finalement, il ne reste plus qu’à exécuter la requête et vérifier le nombre d’éléments retournés pour savoir si notre fichier existe ou non.

Pour aller plus loin

Au delà du nom d’un fichier, il est possible de rechercher des fichiers en filtrant sur bien des propriétés et mots clés, comme par exemple le nom d’un artiste ou d’un album, ou encore les dimensions d’une photo…

Pour plus d’infos sur l’AQS voici le lien vers la documentation officielle.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s