1. #1
    Membre du Club
    Inscrit en
    février 2003
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : février 2003
    Messages : 190
    Points : 64
    Points
    64

    Par défaut Rechercher et remplacer un fichier

    Bonjour à tous,
    Je cherche à coder une petite application qui a pour but de corriger un problème dans un fichier géré par une autre application. Un genre de correctif pour faire simple.
    Comme je ne sais pas comment est organisé le système de l'utilisateur, je pensais rechercher le fichier dans tout le système et le remplacer par le fichier corrigé que j'aurai placé dans les ressources de l'appli corrective.
    Je pensais donc utiliser le code suivant :
    1- pour trouver le ou les emplacements du fichier en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Dim allDrives() As DriveInfo = DriveInfo.GetDrives()
            Dim d As DriveInfo
            For Each d In allDrives
                For Each Fichier As String In My.Computer.FileSystem.GetFiles(d.Name, FileIO.SearchOption.SearchAllSubDirectories)
                    If Path.GetFileName(Fichier).ToLower.Contains("bbbeta.txt") Then
                        ListBox1.Items.Add(Fichier)
                    End If
                Next
            Next
    Le hic c'est que dès qu'il y a un dossier du genre System Volume Information , le programme bloque et m'affiche le message suivant :
    L'exception System.UnauthorizedAccessException s'est produite
    HResult=0x80070005
    Message=L'accès au chemin d'accès 'C:\Documents and Settings' est refusé.
    (...)


    Vraisemblablement ce soit être une question d'autorisation.
    Quelqu'un saurait comment octroyer l'autorisation au programme d'aller voir dans ces dossiers ?

    2- Une fois le fichier trouvé, pour le remplacer par un fichier contenu dans les ressources, j'avais établis le code suivant (à supposé que le fichier se trouvait à la racine de E:\)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileSystem.FileCopy(My.Resources.bbbeta, "e:\")
    Là encore, le hic, c'est que j'ai le message suivant System.IO.FileNotFoundException*: 'Le fichier 'version corrigée' est introuvable.'
    Vous l'aurez compris "version corrigée étant le texte contenu dans le fichier bbbeta.txt que j'ai inclus dans les ressources.

    Quelqu'un aurait une idée de la cause et de la solution à ce problème ?

    Je vous remercie par avance pour votre aide si précieuse

  2. #2
    Membre expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    octobre 2008
    Messages
    1 500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 500
    Points : 3 091
    Points
    3 091
    Billets dans le blog
    6

    Par défaut

    Bonsoir,

    1- Tu dois vérifier les attributs de fichiers et répertoire lors du parcours de tes partitions :

    FileAttributes.Hidden et bien d'autres.... Voilà pour la piste à suivre.

    2- Regardes bien ce que te dis l'intellisense sur la signature de la méthode "FileCopy", le deuxième argument est un chemin de fichier donc il te manque certainement quelque chose mais ce n'est pas la bonne pratique de toute manière !
    Pour extraire un fichier des ressources il te faut utiliser la méthode File.WriteAllBytes de l'espace de noms "System.IO"

    A+

  3. #3
    Membre du Club
    Inscrit en
    février 2003
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : février 2003
    Messages : 190
    Points : 64
    Points
    64

    Par défaut

    Merci beaucoup Wallace pour tes indices.
    Ainsi, pour copier le fichier depuis les ressources, j'utilise le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim fichiercible As Byte() = System.Text.Encoding.Default.GetBytes(My.Resources.bbbetatxt)
    File.WriteAllBytes("e:\bbbeta.txt", fichiercible)
    Ca fonctionne comme je veux

    Par contre je ne parviens pas à résoudre mon problème avec les dossiers "spéciaux".
    Je pensais utiliser le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For Each Fichier As String In My.Computer.FileSystem.GetFiles(d.Name, FileIO.SearchOption.SearchAllSubDirectories And FileAttributes.Normal)
                    Dim attribu = File.GetAttributes(Fichier)
                    If attribu = FileAttributes.Normal Then
                        If Path.GetFileName(Fichier).ToLower.Contains("bbbeta.txt") Then
                            ListBox1.Items.Add(Fichier)
                        End If
                    End If
                Next
    Le problème c'est qu’apparemment il faut déterminer si le fichier est dans un dossier "spécial" avant de stocker son chemin dans la variable ...
    Je pensais utiliser UnauthorizedAccessException mais je ne sais pas où le placer.

    Je peux abuser et te demander un peu plus d'aide ?

    Merci d'avance.

  4. #4
    Membre expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    octobre 2008
    Messages
    1 500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 500
    Points : 3 091
    Points
    3 091
    Billets dans le blog
    6

    Par défaut

    Ok pour les ressources ... mais par pitié rancardes-toi sur l'utilisation des attributs de fichiers depuis MSDN :

    https://msdn.microsoft.com/fr-fr/lib...code-snippet-2

    ++

  5. #5
    Membre du Club
    Inscrit en
    février 2003
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : février 2003
    Messages : 190
    Points : 64
    Points
    64

    Par défaut

    Mais je suis justement allé sur MSDN, à la page que tu me recommandes, mais je ne trouves pas le moyen de ne pas explorer les dossiers "spéciaux" ...

  6. #6
    Expert éminent

    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2012
    Messages
    3 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 3 766
    Points : 7 660
    Points
    7 660
    Billets dans le blog
    17

    Par défaut

    Bonjour,

    Sur la page que tu as visitée, tu as la liste des attributs et un exemple avec fileattribute.quelque chose

    Donc avec l'exemple et la liste, y a plus qu'à adapter...


    Également, mets ta recherche dans un try. Et si tu veux absolument savoir quel dossier provoque l'erreur tu peux mettre un Catch spécifique dans ton try.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Catch ex as FileNotFoundException
     
    Catch ex as UnauthorizedAccessException
    et tant qu'à y être, un autre catch intéressant c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Catch ex as PathtoLongException
    Et puis, il y a aussi des dossiers-systèmes que Windows protège autant qu'une maman ourse protège ses petits, qui ne sont pas reconnus comme dossiers spéciaux par VB (Le Framework, en fait) et que VB ne peut jamais trouver ou presqie
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    À force de vouloir considérer les utilisateurs comme des imbéciles patentés, on risque de se mettre dans le trouble.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  7. #7
    Membre du Club
    Inscrit en
    février 2003
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : février 2003
    Messages : 190
    Points : 64
    Points
    64

    Par défaut

    Bonjour Clementmarcotte et merci de te pencher sur ma question.
    Je ne cherche pas à savoir quel dossier provoque l'erreur, mais simplement à rechercher la présence d'un fichier dans tous les répertoires "normaux" (et facilement accessibles).

    J'ai bien compris l'utilisation de fileattribute et de ce qu'il y a à mettre derrière, mais je ne parviens pas à le coupler à me recherche.
    J'ai bien essayé le code suivant, mais mon problème demeure inchangé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each Fichier As String In My.Computer.FileSystem.GetFiles(d.Name, FileIO.SearchOption.SearchAllSubDirectories And FileAttributes.Normal)
    J'ai également essayé de mettre un try comme dans le code ci-dessous. Je n'ai plus d'erreur (juste le msgbox"une erreur"), mais le fichier recherché n'est jamais trouvé ...
    Code : 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
    Dim d As DriveInfo
            For Each d In allDrives
                MsgBox(d.Name)
                Try
                    For Each Fichier As String In My.Computer.FileSystem.GetFiles(d.Name, FileIO.SearchOption.SearchAllSubDirectories And FileAttributes.Normal)
                        Dim attribu = File.GetAttributes(Fichier)
                        If attribu = FileAttributes.Normal Then
                            If Path.GetFileName(Fichier).ToLower.Contains("bbbeta.txt") Then
                                ListBox1.Items.Add(Fichier)
                            End If
                        End If
                    Next
                Catch ex As Exception
                    MsgBox("une erreur")
                End Try
            Next
    Je suis désolé d'abuser de votre patience, mais pourriez vous m'aiguiller un peu plus ?
    Merci d'avance.

  8. #8
    Expert éminent

    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2012
    Messages
    3 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 3 766
    Points : 7 660
    Points
    7 660
    Billets dans le blog
    17

    Par défaut

    Bonjour,


    Searchoption a deux valeurs possibles

    et cette patente-là ne peut tout simplement pas marcher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileIO.SearchOption.SearchAllSubDirectories And FileAttributes.Normal
    Parce que tu essaies de combiner deux énumérations distinctes. En d'autres termes, tu essaie de croiser des pommes et des citrons

    Tu dois passer tes dossiers un par un et tester les attributs de chaque dossier.

    Mais tu travailles à l'envers. Tu as juste à choisir le dossier où mettre le fichier de correction, à t'arranger pour qu'il se retrouve là et a envoyer ton application le chercher là.

    Et puis, ce serait plus logique de mettre ton try DANS ta boucle qui balaie les dossiers au lieu de ce que ce tu fais là.

    À vrai dire, je pense que tu devrais faire un tour

    par là tu les as probablement déjà tous dans ton aide.

    par là


    et par là.

    parce que tu es vraiment mêlé, parce que la recherche et la manipulation de fichiers c'est un sujet fondamental dont la maîtrise est essentielle et que visiblement, un retour à la base s'impose. Sinon, tu vas avoir énormément de difficultés à progresser.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    À force de vouloir considérer les utilisateurs comme des imbéciles patentés, on risque de se mettre dans le trouble.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    avril 2013
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2013
    Messages : 267
    Points : 0
    Points
    0

    Par défaut

    Bonjour,

    Pourquoi vous avez pas changer tous simplement FileIO.SearchOption.SearchAllSubDirectories par FileIO.SearchOption.SearchTopLevelOnly

    voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Try
                For Each Fichier As String In My.Computer.FileSystem.GetFiles("C:/", FileIO.SearchOption.SearchTopLevelOnly)
                    If Path.GetFileName(Fichier).Contains("log.txt") Then
                        ListBox1.Items.Add(Fichier)
                    End If
                Next
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
    ça fonctionne très bien avec aucun message d'erreur.

    cordialement,

  10. #10
    Membre expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    octobre 2008
    Messages
    1 500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 500
    Points : 3 091
    Points
    3 091
    Billets dans le blog
    6

    Par défaut

    Citation Envoyé par hacker59 Voir le message
    Bonjour,

    Pourquoi vous avez pas changer tous simplement FileIO.SearchOption.SearchAllSubDirectories par FileIO.SearchOption.SearchTopLevelOnly
    Bonjour,

    Parce tu ne réponds pas à son dilemme du fait d'une mauvaise compréhension de son problème :

    je pensais rechercher le fichier dans tout le système et le remplacer par le fichier corrigé que j'aurai placé dans les ressources de l'appli corrective.
    De plus, arrêtes de poster du code lorsqu'on se fait chi** à orienter le débat pour que l'intéressé s'en sorte à peu prêt seul, c'est gratifiant pour lui-même et très formateur !

    Clementmarcotte a très bien orienté l'intéressé, reste à voir comment il va s'en dépatouiller.....

    ++

  11. #11
    Expert éminent

    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2012
    Messages
    3 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 3 766
    Points : 7 660
    Points
    7 660
    Billets dans le blog
    17

    Par défaut

    Bonjour,

    Citation Envoyé par hacker59 Voir le message
    Bonjour,

    Pourquoi vous avez pas changer tous simplement FileIO.SearchOption.SearchAllSubDirectories par FileIO.SearchOption.SearchTopLevelOnly
    Son gros problème, c'est qu'il veut chercher sur tout son disque. Quand il tombe sur un dossier, il trouve soit des fichiers, soit des dossiers. Et quand il trouve des sous-dossiers, reprendre la recherche pour chaque sous-dossier.

    Mais, la grosse faiblesse de cette approche c'est de fouiller un paquet de dossiers (exemple Windows) où personne de normalement constitué n'irait mettre son fichier. Un énorme gaspillage de temps et de ressources. Et puis la règle de Pareto permet de croire qu'il a 80% de chances de trouver son fichier dans un jeu de 20 % des fichiers du disque. Et encore là, Mes Documents constitue probablement une cible de choix, à cause de la conviction de Saint Bill que c'est la bonne chose à faire, depuis, je pense, Windows 95 ou Windows 98. Et un paquet compagnies et de développeurs ont adhéré à la secte Mes Documents.

    Et Là, il est, disons,à la deuxième étape de son travail: trouver sur une autre machine, à quel endroit, se trouve le fichier à corriger. Alors qu'il a toutes les possibilités de travailler en amont, dans la première partie de son projet, pour regarder à quel endroit le programme envoie le fichier bâtard.

    Mais là, son "exercice" est quand même intéressant pour lui. Parce que, pour être capable de passer sur tout un disque, il faut être capable de passer sur toute l'arborescence d'un dossier. Et c'est là que l'exception PathToLongException, risque de venir le hanter
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    À force de vouloir considérer les utilisateurs comme des imbéciles patentés, on risque de se mettre dans le trouble.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  12. #12
    Membre du Club
    Inscrit en
    février 2003
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : février 2003
    Messages : 190
    Points : 64
    Points
    64

    Par défaut

    Hoo laa, je ne veux pas créer de bagarre entre membres du forum

    Je vous remercie sincèrement pour votre aide, mais je n'arrive vraiment pas démêler tout ça.
    J'ai bien compris que Searchoption peut être soit en SearchAllSubDirectories soit en SearchTopLevelOnly.
    Si je mets mon Try à l'intérieur de ma boucle For / Next j'ai quand même une erreur parce le programme va pointer un dossier "spécial" ...

    Comme le dis très bien Clementmarcotte, j'aimerais passer les dossiers un par un et tester les attributs de chacun, mais je ne trouve aucune méthode probante ...

  13. #13
    Expert éminent

    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2012
    Messages
    3 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 3 766
    Points : 7 660
    Points
    7 660
    Billets dans le blog
    17

    Par défaut

    Bonjour,

    Oui mais, l'utilisateur quel qu'il soit, réalise un export d'un autre programme. Donc, il doit savoir dans quel dossier il a enregistré son export...
    Ensuite, le même utilisateur doit utiliser ton programme pour corriger son fichier exporté. Donc, si l'utilisateur sait où il as mis son fichier, tu n'as aucun besoin de faire une recherche.

    Si ce n'est pas cela, il va falloir que tu expliques avec précision. Sinon, c'est inutile de continuer ce fil.



    Parce que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for each patente in quelque chose
       Try
          quelque chose
       catch ex as exception
          ne rien mettre ici
       end try
    next
    fait la job, en espérant que la seule erreur qui survient soit un accès non autorisé à un dossier bloqué

    Mais, si tu dois tester des dossiers, sans te préoccuper des fichiers, tu devrais jeter un œil sur cette page

    Parce qu'il y a GetDirectories, pour trouver des dossiers, GetDirectoryInfo, pour trouver de l'information sur un dossier, incluant les attributs. Et le bout de code de hacker59 te donne une ligne qui commence par Path, qui te permets de savoir si un fichier donné se trouve dans un dossier donné.

    Mais svp, relis les lignes en caractères gras et réagis en conséquence, c'est extrêmement important. Parce que ma réflexion sur l'inutilité de continuer ce fil est extrêmement sérieuse.

    Et puis, j'avais espéré qu'en suivant les liens que je t'avais donnés, tu finisses par trouver cette page.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    À force de vouloir considérer les utilisateurs comme des imbéciles patentés, on risque de se mettre dans le trouble.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

Discussions similaires

  1. Shell - Rechercher et remplacer dans un fichier
    Par rom0607 dans le forum Linux
    Réponses: 3
    Dernier message: 12/06/2008, 20h59
  2. Outil de recherche/remplacement pour fichier pbl
    Par Kraian dans le forum Powerbuilder
    Réponses: 1
    Dernier message: 03/08/2007, 08h44
  3. Réponses: 5
    Dernier message: 18/02/2007, 19h35
  4. Afficher, rechercher et remplacer dans un fichier
    Par lynal dans le forum Fichiers
    Réponses: 1
    Dernier message: 13/06/2006, 21h24
  5. rechercher / remplacer dans fichier en hexa
    Par ratdegout dans le forum C++
    Réponses: 2
    Dernier message: 26/05/2006, 14h14

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