Directory.GetFiles et accès refusé

Résolu
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013 - 6 juin 2013 à 10:15
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013 - 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
A voir également:

20 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
6 juin 2013 à 12:40
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
---
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 juin 2013 à 17:48
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.
3
Utilisateur anonyme
7 juin 2013 à 04:23
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
3
Utilisateur anonyme
7 juin 2013 à 16:11
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
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 juin 2013 à 10:26
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 juin 2013 à 10:40
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.
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
6 juin 2013 à 11:45
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 juin 2013 à 12:24
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.
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
6 juin 2013 à 12:48
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
0
Utilisateur anonyme
6 juin 2013 à 14:21
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
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
6 juin 2013 à 14:54
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
0
Utilisateur anonyme
6 juin 2013 à 15:06
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
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
6 juin 2013 à 17:30
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
0
Hackdevil Messages postés 28 Date d'inscription dimanche 2 janvier 2005 Statut Membre Dernière intervention 5 mai 2014
7 juin 2013 à 12:37
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
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
7 juin 2013 à 15:44
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
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
7 juin 2013 à 17:33
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
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
7 juin 2013 à 19:15
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
0
Utilisateur anonyme
7 juin 2013 à 19:25
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
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
7 juin 2013 à 22:37
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
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
8 juin 2013 à 13:26
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
0
Rejoignez-nous