IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

UnauthorizedAccessException Recherche fichiers


Sujet :

Windows Forms

  1. #1
    Membre du Club Avatar de Legarsdelouest
    Homme Profil pro
    Work Package Manager
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Work Package Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 64
    Points
    64
    Par défaut UnauthorizedAccessException Recherche fichiers
    Bonjour à tous

    Je cherche depuis quelques temps à créer une application permettant de rechercher des fichiers.
    Pour ce faire, je passe par la fonction My.Computer.FileSystem.GetFiles. Cependant, je n'arrive pas à accéder à certains dossiers protégés, comme les dossiers systèmes tel que "System Volume Informations".

    Cela ne me dérange pas, car je ne cherche pas à y accéder. Mais je rencontre à chaque fois le problème d'autorisation d'accès (UnauthorizedAccessException) et cela bloque la recherche et bloc l'application.

    Y a-t-il un moyen de contourner ce problème et de faire en sorte que la recherche continue ? Peut-on spécifier à la fonction GetFile de ne chercher que dans les dossiers et fichiers accessibles par l'utilisateur ? Faut-il demander une autorisation au système pour accéder au dossier afin de pouvoir empêcher le blocage ?

    A vrai dire, j'ai déjà essayer de demander des autorisations, mais je reconnais que ne sais pas du tout comment manipuler la class Permission.

    J'espère avoir été clair et précis (j'avoue qu'il s'agit là de ma toute première demande en VB, et donc je découvre le langage des programmeurs).

    Merci d'avance.
    C'est parce que l'on a visé les étoiles qu'on est allé sur la Lune !

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    A ta place j'aurai codé une petite fonction de recherche récursive et simplement entouré le Directory.GetFiles et Directory.GetDirectories d'un Try-Catch pour attraper le UnauthorizedAccessException. Dans ce cas, la recherche poursuivrai normalement vers la suite ...

  3. #3
    Membre du Club Avatar de Legarsdelouest
    Homme Profil pro
    Work Package Manager
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Work Package Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 64
    Points
    64
    Par défaut
    J'ai entouré la méthode par un Try 'nd Catch, mais la recherche ne semble pas se poursuivre. Au fait, qu'entends-tu par une recherche récursive ?
    C'est parce que l'on a visé les étoiles qu'on est allé sur la Lune !

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Ben en fait tu peux faire une fonction récursive (ie. qui s'appelle elle même) pour chercher ce que tu veux ...
    Ceci dit moi j'ai eu des problèmes avec des fonctions "trop" récursives et je préfère ceci par exemple pour rechercher des fichiers :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    Public Shared Function FindFiles(ByVal baseDirectory As DirectoryInfo, ByVal predicate As Predicate(Of FileInfo), ByVal cancelHandler As CancelEventHandler) As FileInfo()
        Dim result As New List(Of FileInfo)()
     
        Dim work As New Queue(Of DirectoryInfo)()
        ' Pour éviter les StackOverflow par la récursivité 
        work.Enqueue(baseDirectory)
     
        Dim c_args As New CancelEventArgs()
        c_args.Cancel = False
     
        Dim workingDirectory As DirectoryInfo = Nothing
     
        While work.Count > 0
            If cancelHandler IsNot Nothing Then
                cancelHandler.Invoke(Nothing, c_args)
                If c_args.Cancel Then
                    Exit While
                End If
            End If
     
            ' il est même possible de séparer tout ça entre plusieurs threads 
     
            workingDirectory = work.Dequeue()
     
            Try
                Dim files As FileInfo() = workingDirectory.GetFiles()
     
                If predicate Is Nothing Then
                    result.AddRange(files)
                Else
                    For Each file As FileInfo In files
                        If predicate.Invoke(file) Then
                            result.Add(file)
                        End If
                    Next
                End If
     
                For Each sub_dir As DirectoryInfo In workingDirectory.GetDirectories()
                    work.Enqueue(sub_dir)
                Next
            Catch generatedExceptionName As IOException
                ' on ignore 
     
            Catch generatedExceptionName As UnauthorizedAccessException
                ' on ignore aussi 
     
            End Try
        End While
     
        Return result.ToArray()
    End Function

  5. #5
    Membre du Club Avatar de Legarsdelouest
    Homme Profil pro
    Work Package Manager
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Work Package Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 64
    Points
    64
    Par défaut
    Merci pour l'exemple. Je vais passer une semaine a comprendre le code, mais j'ai fais quelques modifications pour l'adapter et sa marche. Merci beaucoup, je l'aurai pas trouvé.
    C'est parce que l'on a visé les étoiles qu'on est allé sur la Lune !

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    N'oublie pas le si ça marche pour toi ...

  7. #7
    Membre du Club Avatar de Legarsdelouest
    Homme Profil pro
    Work Package Manager
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Work Package Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 64
    Points
    64
    Par défaut
    Oui je sais merci, je suis en train d'adapter le code pour voir si sa marche.


    Par contre, j'ai du mal avec le 3eme paramètre a spécifier pour la fonction. C'est une fonction à exécuter en cas de problèmes ou d'annulation ? Je pense qu'un exemple de l'utilisation serait plus simple pour moi, merci d'avance

    Voila ce que j'ai mis pour l'instant, ça semble bon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Dim file As New IO.FileInfo("*.avi")
            Dim directory As String = My.Computer.FileSystem.SpecialDirectories.ProgramFiles.ToString
     
            FindFiles(directory, file,??)
    C'est parce que l'on a visé les étoiles qu'on est allé sur la Lune !

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Non le deuxième argument est un délégué qui va retourner True pour accepter le fichier en cours (current As FileInfo) ou False pour ne pas le prendre. Par extension, pour avoir tous les fichiers sans exceptions il faudrait un prédicat qui renvois True en permanence.
    Bon après les méthodes anonymes en C# c'est beau mais en VB je suis pas convaincu ... envoi voilà pour obtenir tous les fichiers .avi :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim fichiers_avi As FileInfo() = FindFiles(New DirectoryInfo("C:\Machin"), New Predicate(Of FileInfo)(Function(ByVal current As FileInfo) current IsNot Nothing AndAlso current.Name.EndsWith(".avi", StringComparison.OrdinalIgnoreCase)), Nothing)

  9. #9
    Membre du Club Avatar de Legarsdelouest
    Homme Profil pro
    Work Package Manager
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Work Package Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 64
    Points
    64
    Par défaut
    Merci beaucoup sa marche impecable. J'aurais jamais trouvé ça moi
    Si j'ai bien compris, via le code que tu as eu la gentillesse de me concevoir, tu construis en quelques sorte ton propre GetFiles().

    Je vais étudier le code, parce qu'il faut dire que je n'en comprends pas la moitié (et encore). Merci beaucoup.

    Juste, serai-t-il possible de retourner le nom du fichier avec le chemin d'accès avant ? (genre C:\Rogerhj\fg.avi)

    Edit : j'ai trouvé une solution dis moi ce que tu en pense. Vu que je retourne a chaque fois les résultats pour les mettre dans une listbox, j'ai ajouté dans la déclaration de la function, puis j'ai rajouter ça dans la partie qui retourne les résultats dans result

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For Each file As IO.FileInfo In files
                            If predicate.Invoke(file) Then
                                result.Add(file)
                                Out.Items.Add(file.FullName)
                            End If
                        Next
    C'est parce que l'on a visé les étoiles qu'on est allé sur la Lune !

  10. #10
    Membre du Club Avatar de Legarsdelouest
    Homme Profil pro
    Work Package Manager
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Work Package Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 64
    Points
    64
    Par défaut
    Au final j'ai un peu modifier le code, et il marche parfaitement. Cela m'a perfectionner en Visual Basic, et j'ai découvert l'usage des Queue, et List. Merci encore.

    Je coche le bouton qui fait du bien
    C'est parce que l'on a visé les étoiles qu'on est allé sur la Lune !

  11. #11
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Ah j'avais pas vu l'edit
    Bon bah si ça marche, c'est tant mieux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Find ls recherche fichiers grandes tailles
    Par damjal dans le forum Linux
    Réponses: 2
    Dernier message: 29/11/2006, 09h23
  2. [VB]fonction rechercher. Fichier chm
    Par ptitesouris dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 31/07/2006, 12h01
  3. Recherche fichier Linux
    Par c-ve dans le forum Shell et commandes GNU
    Réponses: 17
    Dernier message: 03/06/2006, 12h57
  4. [Wanted] Recherche fichier VBAXL8.HLP (Aide VBA Excel 97)
    Par USV dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/04/2006, 22h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo