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 :

Reconstruire le chemin d'une application windows form à partir d'un chemin relatif


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut Reconstruire le chemin d'une application windows form à partir d'un chemin relatif
    Bonjour,

    Je suis en train de développez une application windows form en c#.J'ai besoin de faire ceci.
    J'ai une application monappli.exe qui se trouve dans mon disque local.
    Dans mon appli winform,je veux créer une classe qui fait ceci:

    1 Avoir une méthode qui fait ce traitement (Résolution de chemin d'un script ou d'une appli) :
    La méthode reçoit un chemin string(chemin absolu ou relatif de monappli.exe),
    il teste si le chemin est absolue,il l'affiche sinon à partir du chemin relatif,il reconstruit le chemin absolu de ce chemin
    relatif.

    Je bloque un peu.J'ai essayé avec Les classes File et Directory mais sans succès.

    Quelqu'un peut m'aider avec un exemple ?

    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Normalement, la classe FileInfo fait exactement cela : on instancie un objet de type "FileInfo" et dans tous les cas on retrouve son chemin complet dans la propriété FullName.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    merci pour la réponse.

    Mon souci est que mon appli ne fait pas ce que je veux avec FileInfo et FullName.J'ai un exemple concret que j'ai testé.

    J'ai mon fichier (test.cmd )qui se trouve sur le disque D de mon ordinateur D:\Mytest\Mywork\cshapr\test.cmd.

    Quand je crée cette petite appli console et que je passe (test.cmd) ,il ne me renvoit pas D:\Mytest\Mywork\cshapr\test.cmd

    mais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    The directory 'c:\users\jr\documents\visual studio 2013\Projects\ConsoleApplicat
    ion1\ConsoleApplication1\bin\Debug' contains the following files and directories
    :
    ConsoleApplication1.exe
    ConsoleApplication1.exe.config
    ConsoleApplication1.pdb
    ConsoleApplication1.vshost.exe
    ConsoleApplication1.vshost.exe.config
    ConsoleApplication1.vshost.exe.manifest
    Comment faire pour récupérer le bon chemin D:\Mytest\Mywork\cshapr\test.cmd dans le cas où

    1) je passe juste le nom du fichier comme c'est mon cas : test.cmd

    2) je passe le chemin relatif de test.cmd est qu'il me retrouve le chemin absolue : D:\Mytest\Mywork\cshapr\test.cmd

    mon code :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    using System.IO;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Open an existing file, or create a new one.
                //FileInfo fi = new FileInfo("temp.txt");
                FileInfo fi = new FileInfo("ReBuild.cmd");
     
                // Determine the full path of the file just created.
                DirectoryInfo di = fi.Directory;
     
                // Figure out what other entries are in that directory.
                FileSystemInfo[] fsi = di.GetFileSystemInfos();
     
                Console.WriteLine("The directory '{0}' contains the following files and directories:", di.FullName);
                //Console.ReadLine();
                // Print the names of all the files and subdirectories of that directory. 
                foreach (FileSystemInfo info in fsi)
                    Console.WriteLine(info.Name);
                Console.ReadLine();
            }
        }
    }
    Merci de votre aide

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ok, je vois.

    Normalement, il y a toujours un dossier courant et celui-ci est renvoyé par Environment.CurrentDirectory. C'est par rapport à ce répertoire que la classe FileInfo ou DirectoryInfo se fie lorsqu'on les a construit avec un chemin relatif et qu'ils renvoient le chemin absolu.

    Maintenant, il semblerait, d'après ce que j'ai compris, que tu cherches à connaitre l'emplacement de ton fichier sur le disque. Or, il ne faut pas oublier qu'il peut y avoir dans ce cas plusieurs fichiers avec le même nom dans des dossiers différents. Donc en fait, tu veux faire une recherche comme la fonction recherche de fichier dans Windows. Cela peut prendre quand même pas mal de temps.

    Dans ce cas, une petite requête Linq peut faire l'affaire, avec par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string[] mesFichiers =
    (from fi in Directory.EnumerateFiles(@"d:\","test.cmd")
    select fi.FullName).ToArray();
    En admettant que tu recherches juste sur "d:". Encore une fois, cela peut prendre pas mal de temps...

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Merci encore pour ta réponse.

    Mais avec string[] mesFichiers =
    (from fi in Directory.EnumerateFiles(@"d:\","test.cmd")
    select fi.FullName).ToArray();

    Directory.EnumerateFiles : EnumeratesFiles n'est pas reconnu comme methode ou propriété de Directory

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    using System.IO;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Open an existing file, or create a new one.
                //FileInfo fi = new FileInfo("temp.txt");
                FileInfo fi = new FileInfo("ReBuild.cmd");
     
                // Determine the full path of the file just created.
                DirectoryInfo di = fi.Directory;
     
                // Figure out what other entries are in that directory.
                FileSystemInfo[] fsi = di.GetFileSystemInfos();
     
    string[] mesFichiers =
    (from fi in Directory.EnumerateFiles(@"d:\","test.cmd")
    select fi.FullName).ToArray();
     
                Console.WriteLine("The directory '{0}' contains the following files and directories:", di.FullName);
                //Console.ReadLine();
                // Print the names of all the files and subdirectories of that directory. 
                foreach (FileSystemInfo info in fsi)
                    Console.WriteLine(info.Name);
                Console.ReadLine();
            }
        }
    }
    Peux tu illustrer avec un exemple qui marche.

    Merci.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ah, si tu n'as pas accès à la méthode "EnumerateFiles" c'est que tu t'es mis dans une version du Framework.NET inférieure à 4.
    Dans ce cas remplace-le par "GetFiles".

    En tous cas, tu auras un tableau de chaines de caractères contenant tous les chemins d'accès des fichiers qui s'appellent "test.cmd".

    N'hésites pas à consulter la documentation MSDN sur tous ces sujets...

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Merci Avec visual studio 2013,ça passe.
    Mais j'ai encore une erreur de conflit.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    using System.IO;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            class Program
            {
                static void Main(string[] args)
                {
                    // Open an existing file, or create a new one.
                    //FileInfo fi = new FileInfo("temp.txt");
                    FileInfo fi = new FileInfo("ReBuild.cmd");
     
                    // Determine the full path of the file just created.
                    DirectoryInfo di = fi.Directory;
     
                    // Figure out what other entries are in that directory.
                    FileSystemInfo[] fsi = di.GetFileSystemInfos();
     
                    string[] mesFichiers =
                    (from fi in Directory.EnumerateFiles(@"d:\", "test.cmd")
                     select fi.FullName).ToArray();
     
                    Console.WriteLine("The directory '{0}' contains the following files and directories:", di.FullName);
                    //Console.ReadLine();
                    // Print the names of all the files and subdirectories of that directory. 
                    foreach (FileSystemInfo info in fsi)
                        Console.WriteLine(info.Name);
                    Console.ReadLine();
                }
            }
        }
    }
    Error 1 The range variable 'fi' conflicts with a previous declaration of 'fi' D:\_Projects\test\ConsoleApplication1\ConsoleApplication1\Program.cs 27 23 ConsoleApplication1
    Error 2 'string' does not contain a definition for 'FullName' and no extension method 'FullName' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?) D:\_Projects\SetupWixGetStarting\ConsoleApplication1\ConsoleApplication1\Program.cs 28 28 ConsoleApplication1

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ah oui, tu ne dois pas être très familiarisé avec Linq.

    Etant donné que tu as déjà utilisé un peu plus haut dans le même scope une variable appelée "fi", forcément ça rentre en conflit avec la variable temporaire que j'avais appelée aussi "fi". Il faut donc que l'une des deux soit renommée. En effet, les requêtes Linq comme cela utilisent le mécanisme de var.

    N'hésites pas aussi à regarder des tutoriels sur Linq to object, il y en a plein sur le net...

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Merci encore.
    Au fait il y aurai pas un autre mécanisme pour faire la même chose sans passer par linq.
    Un simple petite classe qui me résout un chemin du style une fonction qui prend en paramètre mon string représentant le
    chemin de mon fichier sur un disque C,D ou E et qui teste si le chemin est absolu ,il le renvoit comme tel si il est relatif,
    il construit son chemin absolu et le renvoit.
    Sans passer par Linq.Tu as un petit exemple sur lequel je peux m'inspirer ?

    Merci.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par obila89 Voir le message
    Au fait il y aurai pas un autre mécanisme pour faire la même chose sans passer par linq.
    Un simple petite classe qui me résout un chemin du style une fonction qui prend en paramètre mon string représentant le
    chemin de mon fichier sur un disque C,D ou E et qui teste si le chemin est absolu ,il le renvoit comme tel si il est relatif,
    il construit son chemin absolu et le renvoit.
    Sans passer par Linq.Tu as un petit exemple sur lequel je peux m'inspirer ?

    Merci.
    Comme je te le disais plus haut, il ne faut pas confondre le fait de chercher un fichier partout et résoudre un chemin relatif en chemin absolu:
    - soit tu cherches un fichier ou un dossier partout et dans ce cas c'est plus simple de faire une requête Linq sauf si tu as envie de faire de la boucle imbriquée avec des tests dans tous les sens, ce que Linq nous épargne gracieusement
    - soit tu as un chemin relatif ou absolu d'un fichier et dans ce cas tu mets le chemin dans le constructeur de la classe "FileInfo" et tu as le membre "FullName" renseigné dans tous les cas. Mais dans ce cas, il se base sur le dossier en cours, et non pas sur tous les dossiers.

    Pour chercher tous un fichier partout tu peux faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var res = from dinfo in DriveInfo.GetDrives()
                  where dinfo.IsReady
                  from fi in dinfo.RootDirectory.EnumerateFiles("test.txt",SearchOption.AllDirectories)
                  select fi.FullName;
    ça te renvoie un IEnumerable avec tous les chemins complets corredpondant à un nom de fichier (et remplacer EnumerateFiles par GetFiles si tu es toujours avec une version de Framework.NET<4)...

    Pour Linq, DriveInfo, DriveInfo.IsReady, etc... ne pas oublier que MSDN est ton ami.

    [EDIT] Ah oui, j'oubliais : n'oublie pas de rajouter l'option "SearchOption.AllDirectories" car par défaut il ne cherche que dans le répertoire actuel...

    [EDIT2]...et si tu veux trouver un fichier qui a un chemin relatif bien précis, tu peux faire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var res = from dinfo in DriveInfo.GetDrives()
                  where dinfo.IsReady
                  from fi in dinfo.RootDirectory.EnumerateFiles("test.txt",SearchOption.AllDirectories)
                  where fi.FullName.EndsWith(@"DossierDavant\test.txt")
                  select fi.FullName;
    pour chercher tous les fichiers qui s'appellent "test.txt" et qui sont dans un sous-répertoire appelé "DossierDavant".
    Dernière modification par Invité ; 04/02/2015 à 15h33.

  11. #11
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Au fait je veux recuperer le chemin absolu de mon fichier test.txt qui se trouve dans D:\MyTest\DossierDavant\test.txt (chemin absolu) et je passe à ma requête
    le chemin relatif voir code.Il me donne une erreur dans le foreach et ne me recupère pas le chemin absolu

    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
    17
    18
    19
    20
    21
    22
    23
    24
    namespace ConsoleApplication1
    {
        class Program
        {
                static void Main(string[] args)
                  {
     
                      var res = from dinfo in DriveInfo.GetDrives()
                                where dinfo.IsReady
                                //from fi in dinfo.RootDirectory.EnumerateFiles("test.txt", SearchOption.AllDirectories)
                                from fi in dinfo.RootDirectory.EnumerateFiles("test.txt", SearchOption.AllDirectories)
                                where fi.FullName.EndsWith(@"DossierDavant\test.txt")
                                select fi.FullName;
     
                      foreach (string fichier in res)
                    {
                        Console.WriteLine("le chemin absolu du fichier est : '{0}' ", fichier);
                        Console.ReadLine();
                    }
     
                }
     
            }
    }
    As tu une idée ,merci

  12. #12
    Invité
    Invité(e)
    Par défaut
    Une erreur?
    Si tu me disais laquelle ça m'avancerait bien...

    Cela dit il y a bien une erreur qui peut se produire à ce stade et c'est le gros défaut des méthodes "EnumerateFiles" de Microsoft, c'est que si jamais pendant la recherche il tombe sur un dossier sur lequel tu n'as pas les droits de lecture, alors ça lance une exception et ça ne cherche pas plus loin. Peut-être que c'est ce qui t'es arrivé?

  13. #13
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    voici l'erreur :

    An unhandled exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.dll

    Additional information: Access to the path 'C:\$Recycle.Bin\S-1-5-21-1175750103-3099865959-740610046-1000' is denied.

    Et comment s'affranchir du droit sur un dossier.



    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    using System.IO;
    namespace ConsoleApplication1
    {
        class Program
        {
                static void Main(string[] args)
                  {
     
                      var res = from dinfo in DriveInfo.GetDrives()
                                where dinfo.IsReady
                                //from fi in dinfo.RootDirectory.EnumerateFiles("test.txt", SearchOption.AllDirectories)
                                from fi in dinfo.RootDirectory.EnumerateFiles("test.txt", SearchOption.AllDirectories)
                                where fi.FullName.EndsWith(@"DossierDavant\test.txt")
                                select fi.FullName;
     
                      foreach (string fichier in res)
                      {
                          Console.WriteLine("le chemin absolu du fichier est : '{0}' ", fichier);
                          Console.ReadLine();
                      }
     
                }
     
        }
    }
    c'est quand je lance l'appli,il arrive ici est il me donne cette erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach (string fichier in res)
                      {
                          Console.WriteLine("le chemin absolu du fichier est : '{0}' ", fichier);
                          Console.ReadLine();
                      }
    Comment s'en affranchir afin d'avoir le chemin absolu : D:\MyTest\DossierDavant\test.txt s'affichait.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Ok, c'est bien ce que je disais alors.
    J'avais moi-même fait des méthodes d'extensions exprès pour parer ce problème.

    Je vais rechercher le code que j'avais fait dessus et je vais le mettre à disposition. C'est vrai que ça pourrait aider plus d'1.

  15. #15
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Ok,

    j'attends que tu puisses mettre cela pour l'adapter à mon problème.

    Merci d'avance.

  16. #16
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Salut Ph_Gr,

    aviez vous trouvé le code à adapter pour s’affranchir du droit d'accès au chemin absolu d'un fichier ?

    merci.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par obila89 Voir le message
    Salut Ph_Gr,

    aviez vous trouvé le code à adapter pour s’affranchir du droit d'accès au chemin absolu d'un fichier ?

    merci.
    Ok, je viens juste de le mettre en ligne!

    Tu peux y accéder en cliquant sur le petit logo de code source en dessous de mon username ou alors cliquer ici.

    Il contient un projet fait sous VS 2013 avec un petit exemple fait à la va vite pour montrer l'utilisation. N'hésites pas à me poser des questions si des choses ne sont pas claires.

  18. #18
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Salut Ph_Gr,

    Merci encore.

    J'ai juste une question.Dans le code que j'ai récupéré,Je pense que c'est cette classe qui pourra m'intéresser.

    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
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Security;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace PhilUtils
    {
    	/// <summary>
    	/// <para>Permet d'énumérer des dossiers et fichiers avec gestion d'erreur.</para>
    	/// <para>V1.1</para>
    	/// </summary>
    	static class DirectoriesEnumerationHelper
    	{
    		/// <summary>
    		/// Enumère les dossiers sans arrêt d'erreur si une erreur se produit.
    		/// </summary>
    		/// <param name="dirInfo">Dossier à regarder.</param>
    		/// <param name="searchPattern">Chaîne recherchée. Le modèle par défaut est «***», qui retourne tous les répertoires.</param>
    		/// <param name="searchOption"><para>L'une des valeurs d'énumération qui spécifie si l'opération de recherche
    		/// doit inclure uniquement le répertoire actif ou tous les sous-répertoires.</para>
    		/// <para>La valeur par défaut est System.IO.SearchOption.TopDirectoryOnly.</para>
    		/// </param>
    		/// <param name="actionOnError">Action à effectuer si une erreur se produit.</param>
    		/// <returns>Collection énumérable de répertoires qui correspond à searchPattern et searchOption.</returns>
    		public static IEnumerable<DirectoryInfo> EnumerateDirectoriesSafe(this DirectoryInfo dirInfo,
    			string searchPattern = "*", SearchOption searchOption = SearchOption.TopDirectoryOnly,
    			Action<Exception> actionOnError = null)
    		{
    			if (null == dirInfo) throw new ArgumentNullException("dirInfo");
    			if (null == actionOnError) actionOnError = exc => { throw exc; };
    			switch (searchOption)
    			{
    				case SearchOption.TopDirectoryOnly:
    					try { return dirInfo.EnumerateDirectories(searchPattern); }
    					catch (ArgumentNullException) { throw; }
    					catch (DirectoryNotFoundException) { throw; }
    					catch (Exception exc) { actionOnError(exc); return Enumerable.Empty<DirectoryInfo>(); }
    				case SearchOption.AllDirectories:
    					return dirInfo.EnumerateAllDirectoriesSafe(searchPattern, actionOnError);
    				default:
    					throw new NotSupportedException();
    			}
    		}
    		private static IEnumerable<DirectoryInfo> EnumerateAllDirectoriesSafe(this DirectoryInfo dirInfo,
    			string searchPattern, Action<Exception> actionOnError)
    		{
    			if (null == dirInfo) throw new ArgumentNullException("dirInfo");
    			if (null == actionOnError) actionOnError = exc => { };
     
    			IEnumerable<DirectoryInfo> dirInfosRet;
    			try { dirInfosRet = dirInfo.EnumerateDirectories(searchPattern); }
    			catch (ArgumentNullException) { throw; }
    			catch (DirectoryNotFoundException) { throw; }
    			catch (Exception exc) { actionOnError(exc); return Enumerable.Empty<DirectoryInfo>(); }
     
    			return dirInfosRet.Concat(dirInfosRet
    				.SelectMany(di => di.EnumerateAllDirectoriesSafe(searchPattern, actionOnError)));
    		}
     
    		/// <summary>
    		/// Enumère les fichiers sans arrêt d'erreur si une erreur se produit.
    		/// </summary>
    		/// <param name="dirInfoRoot">Dossier à regarder.</param>
    		/// <param name="searchPattern">Chaîne recherchée. Le modèle par défaut est «***», qui retourne tous les fichiers.</param>
    		/// <param name="searchOption">
    		/// <para>L'une des valeurs d'énumération qui spécifie si l'opération de recherche
    		/// doit inclure uniquement le répertoire actif ou tous les sous-répertoires.</para>
    		/// <para>La valeur par défaut est System.IO.SearchOption.TopDirectoryOnly.</para>
    		/// </param>
    		/// <param name="actionOnError">Action à effectuer si une erreur se produit.</param>
    		/// <returns>Collection énumérable de fichiers qui correspond à searchPattern et searchOption.</returns>
    		public static IEnumerable<FileInfo> EnumerateFilesSafe(this DirectoryInfo dirInfoRoot,
    			string searchPattern = "*", SearchOption searchOption = SearchOption.TopDirectoryOnly,
    			Action<Exception> actionOnError = null)
    		{
    			if (null == dirInfoRoot) throw new ArgumentNullException("dirInfoRoot");
    			if (null == actionOnError) actionOnError = exc => { };
    			switch (searchOption)
    			{
    				case SearchOption.TopDirectoryOnly:
    					try { return dirInfoRoot.EnumerateFiles(searchPattern); }
    					catch (ArgumentNullException) { throw; }
    					catch (DirectoryNotFoundException) { throw; }
    					catch (Exception exc) { actionOnError(exc); return Enumerable.Empty<FileInfo>(); }
    				case SearchOption.AllDirectories:
    					return EnumerateAllFilesSafe(dirInfoRoot, searchPattern, actionOnError);
    				default:
    					throw new NotSupportedException();
    			}
    		}
     
    		private static IEnumerable<FileInfo> EnumerateAllFilesSafe(this DirectoryInfo dirInfoRoot,
    			string searchPattern, Action<Exception> actionOnError)
    		{
    			if (null == dirInfoRoot) throw new ArgumentNullException("dirInfoRoot");
    			if (null == actionOnError) actionOnError = exc => { };
     
    			IEnumerable<FileInfo> enumerFiles;
    			try { enumerFiles = dirInfoRoot.EnumerateFiles(searchPattern); }
    			catch (ArgumentNullException) { throw; }
    			catch (DirectoryNotFoundException) { throw; }
    			catch (Exception exc)
    			{
    				actionOnError(exc);
    				enumerFiles = Enumerable.Empty<FileInfo>();
    				return enumerFiles;
    			}
     
    			return enumerFiles.Concat(dirInfoRoot.EnumerateDirectoriesSafe("*",
    				SearchOption.TopDirectoryOnly, actionOnError)
    				.SelectMany(dir => dir.EnumerateAllFilesSafe(searchPattern, actionOnError)));
    		}
    	}
    }
    Comment faire pour l'utiliser dans mon cas qui posait problème :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    using System.IO;
    namespace ConsoleApplication1
    {
        class Program
        {
                static void Main(string[] args)
                  {
     
                      var res = from dinfo in DriveInfo.GetDrives()
                                where dinfo.IsReady
                                //from fi in dinfo.RootDirectory.EnumerateFiles("test.txt", SearchOption.AllDirectories)
                                from fi in dinfo.RootDirectory.EnumerateFiles("test.txt", SearchOption.AllDirectories)
                                where fi.FullName.EndsWith(@"DossierDavant\test.txt")
                                select fi.FullName;
     
                      foreach (string fichier in res)
                      {
                          Console.WriteLine("le chemin absolu du fichier est : '{0}' ", fichier);
                          Console.ReadLine();
                      }
     
                }
     
        }
    }
    Sachant que moi je veux juste une classe qui contient une méthode qui prend en paramètre un string (Chemin relatif ou chemin absolu d'un fichier) et qui test :

    1) String contenant chemin absolu d'un fichier vers un disque D ou C ou E (D:\MyTest\DossierDavant\test.txt),alors renvoyer le string en question

    2)String contenant chemin relatif(\DossierDavant\test.txt) alors construire le chemin absolu de ce dernier.

    Si tu peux juste m'illustrer avec un petit exemple avec une application console ou windows form pour voir comment faire.

    Merci d'avance.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par obila89 Voir le message
    ...
    Si tu peux juste m'illustrer avec un petit exemple avec une application console ou windows form pour voir comment faire.

    Merci d'avance.
    L'exemple est dans le code que j'ai fourni, c'est un projet WPF mais tu peux l'ouvrir sans problème avec VS 2013.

  20. #20
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Salut Ph_Gr,
    Mon fichier se trouve dans D:\Mytest\DossierDavant\test.txt

    En testant l'appli, je m'aperçois que si je mets dans le textbox "Fichier à cherchr"

    1)seulement le nom de fichier exemple : test.txt et je clique sur le bouton "chercher un fichier Avec gestion d'exception" :

    il m'affiche bien le chemin complet : D:\Mytest\DossierDavant\test.txt avec les erreurs d'accès

    2)Si je mets seulement \DossierDavant\test.txt (chemin relatif)et je clique sur le bouton "chercher un fichier Avec gestion d'exception" :

    il ne me renvoit pas le chemin absolue et crée une erreur voir pièces jointes.

    Comment faire pour qu'il accepte le chemin relatif et qu'il me renvoit le chemin absolu
    lorsque je clique sur "chercher un fichier Avec gestion d'exception" et "chercher un fichier Sans gestion d'exception".

    et enfin

    2)Si je mets seulement \DossierDavant\test.txt (chemin relatif)et je clique sur le bouton "chercher un fichier Sans gestion d'exception" :

    j'ai une erreur du style :

    An exception of type 'System.ArgumentException' occurred in mscorlib.dll but was not handled in user code

    Additional information: La seconde partie d'un chemin d'accès ne doit pas être un lecteur ou un nom UNC.

    //SANS gestion d'exception. ça s'arrête dès la première exception trouvée!s
    listeTrouvee =
    from dInfo in DriveInfo.GetDrives()
    where dInfo.IsReady
    from fi in dInfo.RootDirectory.EnumerateFiles(fichierAChercher, SearchOption.AllDirectories)
    select fi.FullName;(Mainwindows.xaml ligne 79)
    Images attachées Images attachées   

Discussions similaires

  1. appeler page asp depuis une application windows forms
    Par salihovic dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/09/2009, 12h58
  2. Test automatisé pour une application Windows Forms
    Par Mat_76 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 07/08/2009, 15h37
  3. [Interaction] Comment afficher une application Windows Form dans une WPF ?
    Par Lookoum dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 08/09/2008, 16h50
  4. Réponses: 12
    Dernier message: 21/08/2008, 12h22

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