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 Discussion :

[C++] Creer des repertoires de facon recursive


Sujet :

Windows

  1. #1
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut [C++] Creer des repertoires de facon recursive
    Bonjour, voila je voudrais faire quelque chose comme ca: J'ai mon repertoire C:\TEMP\ et je voudrais creer dans celui-ci C:\TEMP\rep1\rep2\rep3...

    Si j'utilise CreateDirectory, il va falloir que je parse la chaine "C:\TEMP\rep1\rep2\rep3" que l'on va me passer en entree de ma fonction, et que je cree tous les repertoires un par un. Je me demandais si il n'y avait pas une facon de faire cela de maniere recursive et que donc je n'appelle une fonction qu'une seule fois.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est la fonction récursive qui parse à ta place, mais on est obligé d'en passer par la :
    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
    int CreateDir(char *rep)
    {
       HANDLE hdl ;
       if ((hdl = CreateFile(rep, GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL)) == INVALID_HANDLE_VALUE)
       {
            // le directory n'existe pas, on essaye de le créer
            if (CreateDirectory(rep, NULL) == false)
            {
                // echec de la création, on teste pour savoir si le père existe
                char tmp[MAX_PATH];
                ZeroMemory(tmp, MAX_PATH);
                char *p = strrchr(rep, '\\');
                if (p != NULL)
                    strncpy(tmp, rep, p - rep);
                else
                {
                    sprintf(tmp, "Impossible de créer %s", rep);
                    Application->MessageBox(tmp, Application->Title.c_str(), MB_OK);
                    return 0;
                }
                if (CreateDir(tmp) != 0)
                {
                    // la création du répertoire père a réussi, on réessaye
                    if (CreateDirectory(rep, NULL) == false)
                    {
                        sprintf(tmp, "Impossible de créer %s", rep);
                        Application->MessageBox(tmp, Application->Title.c_str(), MB_OK);
                        return 0;
                    }
                    //reussite
                    return 1;
                }
                // echec création
                return 0;
            }
            // création réussie
            return 1;
       }
       // le répertoire existe déjà, pas la peine de le créer
       return 2;
    }
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        int ret = CreateDir("E:\\rep0l\\rep1\\rep2\\rep3");
        switch (ret)
        {
            case 0: Application->MessageBox("Echec de la création", Application->Title.c_str(), MB_OK); break;
            case 1: Application->MessageBox("Réussite de la création", Application->Title.c_str(), MB_OK); break;
            case 2: Application->MessageBox("Répertoire existant déjà", Application->Title.c_str(), MB_OK); break;
        }
    }
    Testé avec C Builder mais avec les API Windows tout de même 8)
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pb macro creer des repertoires automatiquement
    Par Maxbruver dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 22/04/2015, 20h58
  2. Réponses: 0
    Dernier message: 07/10/2012, 19h56
  3. [1.x] supprimer des repertoires de façon recursive
    Par nelk1 dans le forum Symfony
    Réponses: 1
    Dernier message: 25/04/2010, 20h26
  4. Creer des fichiers dans un sous repertoire
    Par maxmarie dans le forum Windows Mobile
    Réponses: 4
    Dernier message: 16/11/2007, 15h30
  5. [langage] comment créer des fichiers ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2002, 16h33

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