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

C# Discussion :

Pourquoi new DirectoryInfo("C:"); retourne le dossier courant ?


Sujet :

C#

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Par défaut Pourquoi new DirectoryInfo("C:"); retourne le dossier courant ?
    Bonjour à tous,

    Il y a des mystères que j'aimerais bien élucider...

    Alors que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DirectoryInfo dir = new DirectoryInfo("D:");
    retourne le dossier du Lecteur D,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DirectoryInfo dir = new DirectoryInfo("E:");
    retourne le dossier du Lecteur E,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DirectoryInfo dir = new DirectoryInfo("F:");
    retourne le dossier du Lecteur F,

    etc...

    Et bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DirectoryInfo dir = new DirectoryInfo("C:");
    retourne le dossier courant !!!!!!!!!!!!!!!!!

    La question est : Pourquoi ?

    Je me pose cette question car je suis obligé d'utiliser une liste des lecteurs (C:, D:, etc...) sans antislash à la fin, pour remplir un TreeView. Je dis sans antislash, car si jamais je veux récupérer le FullPath d'un de mes nodes, et s’il y a un antislash dans le nom du lecteur, j'aurais un double antislash dans le FullPath du node ! Par exemple, node.FullPath retourne : "C:\\Windows\system32".

    Voilà, si quelqu'un à une réponse ou une solution, je lui en serais très reconnaissant !

    Merci !

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Par défaut
    On peux éventuellement tester avec ce code, pour voir les sous-dossiers du dossier et s'apercevoir que pour le lecteur "C:", on a les dossiers du dossier dans lequel s'exécute le programme :

    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
     
    using System.IO;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
     
                // POUR LE LECTEUR H:
                DirectoryInfo dir = new DirectoryInfo("H:");
                DirectoryInfo[] list = dir.GetDirectories();
                foreach (DirectoryInfo i in list) MessageBox.Show(i.FullName);
     
                // POUR LE LECTEUR C:
                dir = new DirectoryInfo("C:");
                list = dir.GetDirectories();
                foreach (DirectoryInfo i in list) MessageBox.Show(i.FullName);
            }
        }
    }

  3. #3
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    En tant qu'ancien utilisateur de MS-DOS, voilà ce que je suppute :
    • ouvre une fenêtre de commande (démarrer => exécuter => cmd)
    • le prompt montre (par exemple) : c:\documents and settings\TOTO\
    • tape "d:" : ca t'amène sur d:\
    • tape cd folder, où folder est un dossier de d ; ca t'amène sur d:\folder
    • tape "c:" : ca te ramène sur c:\documents and settings\TOTO\
    • tape "c:" : ca te laisse dans c:\documents and settings\TOTO\
    • tape d: ca t'amène de nouveau sur d:\folder


    Donc en gros, C: n'est pas la racine de C, c'est le répertoire courant de C. La racine de C, c'est C:\.

    D'ailleurs, la barre d'adresse de l'explorer affiche c:\ quand on est à la racine, et c:\folder (sans antislash !) sinon.

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Par défaut
    Ca a le mérite d'être clair.

    Merci !

    Mais maintenant... Comment avoir un [Directory-]TreeView où par exemple TreeView.Nodes[4].FullPath ne retourne pas 2 antislash ? Comme ceci: "C:\\Windows\system32".

    Ou où trouver un composant Directory TreeView sans ce problème ?

  5. #5
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    question bête, mais, vu que c'est ton appli qui gère le path, tu ne peux pas faire un Replace(@":\\", @":\") ?

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Par défaut
    Tout est possible. Mais gérer le remplacement dans une quinzaine de fonctions ça commence à être lourd. Et ça va l'être encore plus car nous sommes plusieurs sur le projet, mais également parce que c'est une application qui va vivre, et que je ne serais pas forcément derrière la personne qui va prendre les rênes pour lui dire "ah oui, mais attention, ici, ceci ; là-bas, cela...". Trouver des solutions simples le plus tôt possible, c’est autant de travail en moins en terme de documentation et de temps passé en explications et compréhension.

    Sinon le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(string.Contains) string.Replace(,);
    est la solution que j'ai retenu au départ. Mais je pensais pouvoir me passer de ces infâmes antislashs.

  7. #7
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    et sinon, en prenant le problème dans l'autre sens, si tu centralise tous tes appels à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DirectoryInfo dir = new DirectoryInfo("H:");
    DirectoryInfo[] list = dir.GetDirectories();
    Dans une seule fonction, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public DirectoryInfo[] GetDirectoriesFromGivenPath(string path){
     
      if (path.EndsWith(":")) path += @\";
     return new DirectoryInfo(path).GetDirectories();
    }
    Parce que c'est le genre de problématique que je préfére addresser dans le code "métier" plutot que dans un composant graphique quelconque (à moins que je n'aie rien compris au pb, ce qui est possible à cette heure-ci )

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  8. #8
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Heureusement, les concepteurs ont tout prévu, y compris la méthode System.IO.Path.Combine, qui sert précisément à ça

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    Guulh tu m'as devancé ^^

    alors je vais juste préciser un peu :p

    Path.Combine(string blabla,string blibli)

    va t'agglomérer tes deux chaines afin de former un path valide (plus de double slash ni de slash manquant etc...)
    donc tu peux tranquillement écrire ton "c:\"

    quand tu tapes "c:" sous DOS ca t'amène dans le répertoire courant du lecteur c: (system32 dans ton cas)
    "\" lui précise sa racine

    vérifie tout de même la chaine en sortie car dans certains cas le résultat n'est pas toujours celui voulu

Discussions similaires

  1. [MySQL] Pourquoi dois-je utiliser des "quotes penchées" dans mes requêtes?
    Par v4np13 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/02/2008, 23h23

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