web-dev-qa-db-fra.com

Windows 10 Universal App Accès fichier/répertoire

Je développe une application qui lit les fichiers jpeg et pdf à partir d'un emplacement configurable sur le système de fichiers . Il existe actuellement une version en cours d'exécution implémentée dans WPF et j'essaie maintenant de passer aux nouvelles applications universelles Windows.

Le code suivant fonctionne bien avec WPF:

public IList<string> GetFilesByNumber(string path, string number)
    {
        if (string.IsNullOrWhiteSpace(path))
            throw new ArgumentNullException(nameof(path));

        if (string.IsNullOrWhiteSpace(number))
            throw new ArgumentNullException(nameof(number));

        if (!Directory.Exists(path))
            throw new DirectoryNotFoundException(path);

        var files = Directory.GetFiles(path, "*" + number + "*",
           SearchOption.AllDirectories);

        if (files == null || files.Length == 0)
            return null;
        return files;
    }

En utilisant Universal Apps, j'ai rencontré quelques problèmes:

  • Directory.Exists n'est pas disponible 
  • Comment puis-je lire des répertoires en dehors de mon stockage d'application?

Pour lire à partir d'un autre répertoire en dehors du stockage de l'application, j'ai essayé ce qui suit:

StorageFolder folder = StorageFolder.GetFolderFromPathAsync("D:\\texts\\");
var fileTypeFilter = new string[] { ".pdf", ".jpg" };
QueryOptions queryOptions = new QueryOptions(CommonFileQuery.OrderBySearchRank, fileTypeFilter);
queryOptions.UserSearchFilter = "142";
StorageFileQueryResult queryResult = folder.CreateFileQueryWithOptions(queryOptions);
IReadOnlyList<StorageFile> files = queryResult.GetFilesAsync().GetResults();

Le problème est le suivant: cela ne fonctionne pas, mais je reçois une exception:

Une exception de type 'System.UnauthorizedAccessException' s'est produite dans TextManager.Universal.DataAccess.dll mais n'a pas été gérée dans le code utilisateur Informations complémentaires: L'accès est refusé. (Exception de HRESULT: 0x80070005 (E_ACCESSDENIED))

Je sais que vous devez configurer certaines autorisations dans le manifeste, mais je ne peux pas en trouver une qui convienne aux opérations du système de fichiers IO ...

Est-ce que quelqu'un a également eu de tels problèmes/une solution possible?

Solution: Parmi les solutions proposées par @Rico Suter, j'ai choisi FutureAccessList en combinaison avec FolderPicker. Il est également possible d'accéder à l'entrée avec le jeton après le redémarrage du programme.

Je peux également vous recommander les guides UX et ce exemple Github .

Merci beaucoup!

21
WhiteIntel

Dans les applications UWP, vous ne pouvez accéder qu'aux fichiers et dossiers suivants: 

Si vous avez besoin d'accéder à tous les fichiers dans D:\, l'utilisateur doit sélectionner manuellement le lecteur D:\ à l'aide de FolderPicker. Vous avez alors accès à tout ce qui se trouve dans ce lecteur ... 

METTRE À JOUR:

Windows 10 build 17134 (Mise à jour 2018, version 1803) a ajouté des fonctionnalités supplémentaires d'accès au système de fichiers pour les applications UWP:

  • Toute application UWP (une application fenêtrée normale ou une application console) déclarant une variable AppExecutionAlias se voit désormais accorder un accès implicite aux fichiers et aux dossiers du répertoire de travail actuel et au-dessous lorsqu’elle est activée à partir d’une ligne de commande. Le répertoire de travail actuel provient de l'emplacement du système de fichiers choisi par l'utilisateur pour exécuter votre AppExecutionAlias.

  • La nouvelle fonctionnalité broadFileSystemAccess accorde aux applications le même accès au système de fichiers que l'utilisateur qui l'exécute actuellement sans invites de style sélecteur de fichiers. Cet accès peut être défini dans le manifeste de la manière suivante:

    xmlns:rescap="http://schemas.Microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
    ...
    IgnorableNamespaces="uap mp uap5 rescap">
    ...
    <Capabilities>
      <rescap:Capability Name="broadFileSystemAccess" />
    </Capabilities>

Ces modifications et leur intention sont décrites en détail dans l'article de MSDN Magazine intitulé Plateforme Windows universelle - Fermeture des lacunes UWP-Win32 . Les articles notent ce qui suit:

Si vous déclarez une capacité restreinte, cela déclenche une augmentation de examen minutieux au moment où vous envoyez votre colis au magasin pour publication. ... Vous n’avez pas besoin d’une AppExecutionAlias si vous avez ceci aptitude. Comme il s’agit là d’une fonctionnalité si puissante, Microsoft le fera n'accorde cette possibilité que si le développeur de l'application fournit une information convaincante les raisons de la demande, une description de la manière dont cela sera utilisé et une explication de la manière dont cela profite à l'utilisateur.

plus loin:

Si vous déclarez la capacité broadFileSystemAccess, vous n’avez pas besoin de déclarer l'une des capacités du système de fichiers de portée plus étroite (Documents, images ou vidéos); en effet, une application ne doit pas déclarer les deux broadFileSystemAccess et l’un des trois autres systèmes de fichiers capacités.

enfin:

Même après que l’application a été accordée, il y a aussi un vérification à l'exécution, car cela pose un problème de confidentialité pour le utilisateur. Tout comme d'autres problèmes de confidentialité, l'application déclenchera un consentement de l'utilisateur Invite lors de la première utilisation. Si l'utilisateur choisit de refuser permission, l'application doit être résiliente à cela.

47
Rico Suter

La réponse acceptée n'est plus complète. Il est maintenant possible de déclarer broadFileSystemAccess dans le manifeste de l'application pour lire le système de fichiers de façon arbitraire.

La page Autorisations d’accès aux fichiers contient des détails.

Notez que l'utilisateur peut toujours révoquer cette autorisation via l'application des paramètres.

4
Sam

Vous pouvez le faire à partir de l'interface utilisateur dans VS 2017.

Cliquez sur le fichier manifeste -> Fonctionnalités -> Vérifier la photothèque ou ce que vous voulez.

 enter image description here

0
Fangming

ce n'est pas vrai: Les fichiers qui sont ouverts avec une association d'extension de fichier ou via le partage essayez-le, en ouvrant les fichiers à partir de la messagerie (Outlook) ou du bureau ... cela ne fonctionne tout simplement pasvous devez d’abord accorder les droits par le sélecteur de fichiers . alors c’est sh ...

0
Raimund Popp

Selon la documentation MSDN: "Le sélecteur de fichiers permet à une application d'accéder aux fichiers et aux dossiers, de les joindre, de les ouvrir, de sauvegarder un fichier."

https://msdn.Microsoft.com/en-us/library/windows/apps/hh465182.aspx

Vous pouvez lire un fichier à l'aide de FilePicker via une interface utilisateur standard.

Cordialement

0
Emmanuel DURIN