Directory.GetFiles et accès refusé [Résolu]

cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention - 6 juin 2013 à 10:15 - Dernière réponse : cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention
- 8 juin 2013 à 13:26
Bonjour,

Je rencontre une difficulté dans mon application.
J'utilise la méthode "Directory.GetFiles" sur un disque entier. Celle-ci provoque l'erreur suivante :
- "L'accès au chemin d'accès 'D:\System Volume Information\' est refusé."
ce qui se confirme lorsque l'on utilise l'explorateur.

Y a t'il un moyen de contourner ce fonctionnement sans faire une usine à gas (faire une fonction récursive dans tous les répertoires qui gère le dysfonctionnement).

Merci d'avance pour vos idées.

Système utilisé Windows Vista

RLAPT
Afficher la suite 

Votre réponse

20 réponses

Meilleure réponse
NHenry 14278 Messages postés vendredi 14 mars 2003Date d'inscription 21 octobre 2018 Dernière intervention - 6 juin 2013 à 12:40
3
Merci
Bonjour,

Pour éviter que ce problème (qui peut être rencontré si l'utilisateur n'est pas administrateur de sa machine aussi), tu n'as d'autres choix que de faire une recherche récursive "manuelle" et de traiter les erreurs qui peuvent survenir.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---

Merci NHenry 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de NHenry
Meilleure réponse
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 6 juin 2013 à 17:48
3
Merci
Oh ...
La remarque de acive était parfaitement justifiée.
Si ce genre d'observation ne te plait pas, évite les formulations genre :
Vous pouvez-vous inspirer, par exemple, de la réponse contenue dans le lien suivant

qui a UN sens ...
et préfère :
"j'ai pu trouver ma solution dans la réponse contenue dans le lien suivant"
La politesse est comme une auberge espagnole : on y trouve ce que l'on apporte.
Bonne chance


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de ucfoutu
Meilleure réponse
Utilisateur anonyme - 7 juin 2013 à 04:23
3
Merci
Vous pouvez-vous inspirer, par exemple, de la réponse contenue dans le lien suivant
=>> Faux! c'est toi qui a besoin d'inspiration


Quand je t'ai dit "c'est toi qui a besoin d'inspiration" c'est uniquement que le code dont tu as besoin je l'ai fait en 3 minutes et parfaitement fonctionnel, donc je n'ai plus besoin d'inspiration, moi...

Et surtout pas du VB6 qui doit se transcrire en SQL (ou l'inverse) tout en postant dans VB.NET !!!

C'est pas constructif ça ???

Ceci-dit nous n'avons par aperçu la moindre ligne de code écrit par toi


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Meilleure réponse
Utilisateur anonyme - 7 juin 2013 à 16:11
3
Merci
Oui, vu que nous sommes en plein exercice de copier/coller, que penses-tu de celui-ci?:
Option Explicit On
Option Strict On

Public Class Form1
    Dim ListFichiers As New ListBox
    Dim ListErreurs As New ListBox

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListFichiers.Top = 0
        ListErreurs.Top = ListFichiers.Height + 20
        ListFichiers.Left = 0
        ListErreurs.Left = 0
        ListFichiers.Width = 450
        ListErreurs.Width = 450
        Me.Controls.Add(ListFichiers)
        Me.Controls.Add(ListErreurs)
        Recherche("c:\windows\system32")
    End Sub

    Private Sub Recherche(ByVal Chemin As String)
        Try
            For Each Fichier In System.IO.Directory.GetFiles(Chemin)
                ListFichiers.Items.Add(Fichier)
            Next
        Catch ex As Exception
            ListErreurs.Items.Add(ex.Message)
        End Try
        Try
            For Each Dossier In System.IO.Directory.GetDirectories(Chemin)
                Recherche(Dossier)
            Next
        Catch ex As Exception
        End Try
    End Sub
End Class



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 6 juin 2013 à 10:26
0
Merci
Bonjour,
Tu ne pourras faire par code ce que tu ne peut faire manuellement.
Il s'agit là d'un dossier protégé par Windows.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 6 juin 2013 à 10:40
0
Merci
Il est bien entendu possible de "forcer la main" de Windows, mais :
1) pas recommandé du tout !
2) méthode différente selon OS et type de fichiers/système (NTFS, FAT32, ...)
3) tu ne pourras faire une telle gysmnastique QUE sur TA machine, et "en tant qu'administrateur" (bien évidemment)
Si cela t'intéresse vraiment ===>>> de la lecture ===>>
Tapez le texte de l'url ici.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention - 6 juin 2013 à 11:45
0
Merci
Bonjour,

Merci de vos réposes.
Je pense que je n'ai pas été complet. En fait, ce qu'il y a dans "D:\System Volume Information" ou un autre répertoire système de Windows, ne m'intéresse pas.
Je souhaite en fait récupérer tous les fichiers accessibles d'un disque.

Je pense également savoir comment faire, mais d'un naturel confiant, je suppose que peut être une méthode du genre de "Directory.GetFiles" qui passe son chemin sur les fichiers système existe.

MErci à tous

RLAPT
Commenter la réponse de cs_rlapt
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 6 juin 2013 à 12:24
0
Merci
Je pense que je n'ai pas été complet

Bon. Je pense alors que je n'ai pas été non plus complet. Et vais l'être :
Je souhaite en fait récupérer tous les fichiers accessibles d'un disque

1) Il se trouve que certains dossiers (et donc les fichiers qu'ils abritent) ne sont pas accessibles ===>>
- certains parce qu'ils sont protégés par Windows (et relis mon précédent message)
- d'autres parce qu'ils sont en cours d'utilisation (et pour ceux-là, VIsual Basic seul n'y pourra rien).
2) regarde le mot (récupérer) que j'ai souligné. Il veut à la fois tout dire et ne rien dire. Tout dépend de ce que l'on entend par ce mot !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention - 6 juin 2013 à 12:48
0
Merci
Re bonjour ucfoutu,

Merci de prendre du temps pour me répondre.

Par récupérer, c'est le chemin + le nom. Ceci est sous-entendu, comme le laisse présager la méthode "Directory.GetFiles" mentionnée dans ma 1ère demande.

Je reviens sur ma difficulté qui est : quand un répertoire st inaccessible "Directory.GetFiles" renvoie une erreur et je reformule ma question :
Je souhaite récupérer, à partir d'un répertoire et dans tous ses sous-répertoires, tous les chemins et noms de fichiers des dits répertoires. A la limite, si ceux qui ne sont pas accessibles n'apparaissent pas, ce n'est pas un problème.
Le traitement des fichiers accessibles ou/non, ne pose pas de difficultés.
Je vois une solution qui est de balayer l’ensemble des répertoires et de traiter les erreurs dans chaque répertoire, mais j’espère que Bill à prévu ce problème 


Cordialement.

RLAPT
Commenter la réponse de cs_rlapt
Utilisateur anonyme - 6 juin 2013 à 14:21
0
Merci
Bonjour,

Il faudrait gérer les erreurs avec un try - catch - end try.
Commet est ta méthode récursive?



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention - 6 juin 2013 à 14:54
0
Merci
Bonjour Acive,

La méthode se trouve un peu partout sur les forums.
Vous pouvez-vous inspirer, par exemple, de la réponse contenue dans le lien suivant :
Tapez le texte de l'url ici.

Il faut effectivement gérer par programme toutes les erreurs possibles.

Cordialement

RLAPT
Commenter la réponse de cs_rlapt
Utilisateur anonyme - 6 juin 2013 à 15:06
0
Merci
Vous pouvez-vous inspirer, par exemple, de la réponse contenue dans le lien suivant

=>> Faux! c'est toi qui a besoin d'inspiration

Alors ton lien nous dirige vers le forum SQL et en plus ils codent en VB6 , alors que tu as posté dans: Forum > VB.NET et VB 2005 >

Bon... ce n'est pas très compliqué le try - end try montre nous le code que tu as commencé déjà.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention - 6 juin 2013 à 17:30
0
Merci
RE bonjour acive,

Je n'ai pas besoin de remarques de ce type. Elles n'apportent pas grand chose au sujet.

Mon message était simplement pour montrer le fonctionnement de la méthode récurcive pour lister les fichiers.


Merci


RLAPT
Commenter la réponse de cs_rlapt
Hackdevil 28 Messages postés dimanche 2 janvier 2005Date d'inscription 5 mai 2014 Dernière intervention - 7 juin 2013 à 12:37
0
Merci
Salut, j'avais le même problème que j'ai réussi à résoudre sur un autre post.

Tu peux y jetter un oeil ici => http://www.vbfrance.com/forum/sujet-LISTER-REPERTOIRES-SOUS-REPERTOIRES-ACCES-REFUSE_1643702.aspx#4
Commenter la réponse de Hackdevil
cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention - 7 juin 2013 à 15:44
0
Merci
Bonjour Hackdevil,

Merci de ton lien. En fait je suis parti sur une solution qui me parait à peu prés semblable.
Ca a l'air de fonctionner comme je le souhaite. Je vous la livre pour info. Attention sans garantie, je viens juste de la terminer.
Reste que je suis surpris que Microsoft n'ai pas prévu ce fonctionnement.

Merci à tous.

Définitions des arguments :
Init : Toujours à True dans l'appel de la fonction. Permet de retrouver la première occurrence de la récursivité
VarRet : Variable tableau redimensionnable (1 dim) qui contiendra la liste des fichiers avec leur chemin
Chemin : Identique à Directory.GetDirectories et Directory.GetFiles
OptionRecher : Identique à Directory.GetDirectories et Directory.GetFiles
SousRép : True si l'on souhaite parcourir tous les sous-répertoires
Alarme : True si l'on souhaite avoir des messages pour les erreurs




    Function PG_ListeDesFichiers(Init As Boolean, ByRef VarRet() As String, Chemin As String, OptionRecher As String, Optional SousRép As Boolean False, Optional Alarme As Boolean False)
        Dim I As Int32 0, J As Int32 0, Pos As Int32 = 0, TempoDir() As String, TempoFich() As String
        Static ListFich() As String, GestAlarme As Boolean
        If Init = True Then
            ReDim ListFich(0)
            GestAlarme = False
        End If
        PG_ListeDesFichiers = False
        If SousRép Then
            Try
                TempoDir = Directory.GetDirectories(Chemin, OptionRecher, SearchOption.TopDirectoryOnly)
            Catch ex As Exception
                If Alarme Then MsgBox("Erreur de lecture des répertoires du chemin : " & Chemin)
                GestAlarme = True
                GoTo FinListeDesFichiers
            End Try
            For I = 0 To UBound(TempoDir)
                PG_ListeDesFichiers(False, VarRet, TempoDir(I), OptionRecher, SousRép, Alarme)
                Try
                    TempoFich = Directory.GetFiles(TempoDir(I), OptionRecher, SearchOption.TopDirectoryOnly)
                Catch ex As Exception
                    If Alarme Then MsgBox("Erreur de lecture des fichiers du chemin : " & Chemin)
                    GestAlarme = True
                    GoTo FinListeDesFichiers
                End Try
                For J = 0 To UBound(TempoFich)
                    Pos = UBound(ListFich)
                    ReDim Preserve ListFich(Pos + 1)
                    ListFich(Pos) = TempoFich(J)
                Next
            Next
        Else
            Try
                TempoFich = Directory.GetFiles(Chemin, OptionRecher, SearchOption.TopDirectoryOnly)
            Catch ex As Exception
                If Alarme Then MsgBox("Erreur de lecture des fichiers du chemin : " & Chemin)
                GestAlarme = True
                GoTo FinListeDesFichiers
            End Try
        End If


        For I = 0 To UBound(TempoDir)
        Next
FinListeDesFichiers:
        If Init = True Then
            ReDim Preserve ListFich(UBound(ListFich) - 1)
            VarRet = ListFich
            PG_ListeDesFichiers = GestAlarme
        End If
    End Function



RLAPT
Commenter la réponse de cs_rlapt
cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention - 7 juin 2013 à 17:33
0
Merci
Bonjour,

Effectivement, c'est plus concis. Le "For Each" améliore les choses.

Merci de l'idée. je vais modifier pour en tenir compte.

Cordialement.

RLAPT
Commenter la réponse de cs_rlapt
cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention - 7 juin 2013 à 19:15
0
Merci
Bonjour,

Juste pour le fun, la même méthode que précédemment en tenant compte des remarques de acive.

Bonsoir à tous.


   Function PG_ListeDesFichiers(Init As Boolean, ByRef VarRet() As String, Chemin As String, OptionRecher As String, Optional SousRép As Boolean False, Optional Alarme As Boolean False)
        Dim Pos As Int32 0, TAl As String ""
        Static GestAlarme As Boolean
        If Init = True Then
            GestAlarme = False
        End If
        PG_ListeDesFichiers = False
        If SousRép Then
            Try
                For Each Dossier In Directory.GetDirectories(Chemin, OptionRecher, SearchOption.TopDirectoryOnly)
                    Tal = "Erreur de lecture des répertoires du chemin : " & Chemin
                    PG_ListeDesFichiers(False, VarRet, Dossier, OptionRecher, SousRép, Alarme)
                    For Each Fichier In Directory.GetFiles(Dossier, OptionRecher, SearchOption.TopDirectoryOnly)
                        Tal = "Erreur de lecture des fichiers du chemin : " & Chemin
                        Pos = UBound(VarRet)
                        ReDim VarRet(Pos + 1)
                        VarRet(Pos) = Fichier
                    Next
                Next
            Catch ex As Exception
                If Alarme Then MsgBox(Tal)
                GestAlarme = True
            End Try
        Else
            Try
                VarRet = Directory.GetFiles(Chemin, OptionRecher, SearchOption.TopDirectoryOnly)
            Catch ex As Exception
                If Alarme Then MsgBox("Erreur de lecture des fichiers du chemin : " & Chemin)
                GestAlarme = True
            End Try
        End If

        If Init = True Then
            ReDim Preserve VarRet(UBound(VarRet) - 1)
            PG_ListeDesFichiers = GestAlarme
        End If
    End Function


RLAPT
Commenter la réponse de cs_rlapt
Utilisateur anonyme - 7 juin 2013 à 19:25
0
Merci
Oui... alors, le défi que je lance c'est de faire tout ça beaucoup plus rapidement, c'est à dire, (par exemple) pouvoir scanner tout ton disque C:, et afficher tous les fichiers en environ une dizaine de secondes. (une dizaine j'exagère un peu).

Ça c'est un défi de taille, par exemple en gérant plusieurs 'threads' à la fois.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention - 7 juin 2013 à 22:37
0
Merci
Bonsoir,

Je suis désolé que ce ne soit pas à mon niveau.
Je ne me suis pas penché sur la notion de 'threads'.
Mais, je suis intéressé par le résultat.

Cordialement.

RLAPT
Commenter la réponse de cs_rlapt
cs_rlapt 63 Messages postés lundi 6 octobre 2003Date d'inscription 25 juin 2013 Dernière intervention - 8 juin 2013 à 13:26
0
Merci
Bonjour,

Attention une erreur s'est glissée dans le dernier code envoyé.

Il faut remplacer

ReDim VarRet(Pos + 1)
par
ReDim Preserve VarRet(Pos + 1)

Pour que cela fonctionne correctement. Mais vous aviez sans doute corrigé de vous même.

Cordialement.


RLAPT
Commenter la réponse de cs_rlapt

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.