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

MFC Discussion :

pb suppression répertoire non vide


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 18
    Par défaut pb suppression répertoire non vide
    Je souhaite utiliser la fonction myDeleteDirectory dont le code se trouve dans
    faq Visual C++ (chapitre 10).
    L'exemple fonctionne très bien. En revanche, lorsque le chemin du répertoire
    à supprimer se trouve dans une CString, la fonction SHFileOperation qui fait le travail échoue et me renvoie le code 1026 (Descripteur non valide)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CString subRep("d:\\Mesures\\Camera01");
     
                myDeleteDirectory((LPCTSTR)subRep,true);
    En revanche, l'exécution de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        myDeleteDirectory("d:\\Mesures\\Camera01", true)
    est correcte.

    Qui peut m'aider et m'expliquer ce que je fais d'incorrect?

    Merci.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut, bizarre .
    essaye en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     myDeleteDirectory(subRep.GetBuffer(0),true);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 18
    Par défaut
    essaye en faisant

    Code :
    myDeleteDirectory(subRep.GetBuffer(0),true);
    J'ai déjà essayé, mais ça ne marche pas. Toujours le même code d'erreur...

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    euh ... bizarre oui ...
    je dirais meme qu'avec une appli MFC, meme avec le chemin en dur ca marche pas, alors qu'avec une appli win32 pure, pas de soucis

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    bah il te reste toujours la méthode a l'ancienne :
    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
     
    BOOL EmptyDirectory(const char *szRep)
    {
     
        WIN32_FIND_DATA FindFileData;
        char path[MAX_PATH];
     
        {
            CString str;
            str=szRep;
            if(str.Right(1)!="\\") str+="\\";
            str+="*.*";
     
            strcpy(path,str);
        }
     
        HANDLE hFind = FindFirstFile(path, &FindFileData);
        if (hFind==INVALID_HANDLE_VALUE)  return FALSE;
        if (strcmp(FindFileData.cFileName,".")!=0 && strcmp(FindFileData.cFileName,"..")!=0)
        {
            strcpy(path,szRep);
            strcat(path,"\\");
            strcat(path,FindFileData.cFileName);
            EmptyDirectory(path);
        }
        DWORD a = 0;
        while (a != ERROR_NO_MORE_FILES)
        {
            if (!FindNextFile(hFind, &FindFileData))
                a = GetLastError();
            else
            {
                if (strcmp(FindFileData.cFileName,".")!=0 && strcmp(FindFileData.cFileName,"..")!=0)
                {
                    strcpy(path,szRep);
                    strcat(path,"\\");
                    strcat(path,FindFileData.cFileName);
                    if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
                    {
                        EmptyDirectory(path);
                        RemoveDirectory(path);
                    }
                    else
                    {
                        SetFileAttributes(path,FILE_ATTRIBUTE_NORMAL);
                        DeleteFile(path);
                    }
                }
            }
        }
        FindClose(hFind);
        return TRUE;
    }

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Dis-moi si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     myDeleteDirectory(TEXT("d:\\Mesures\\Camera01"), true)
    marche.

    Si oui, je n'y comprends plus rien.
    Si non, voilà le problème: Ta fonction myDeleteDirectory demande une chaîne normale, et la CString lui passe une chaîne unicode.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 18
    Par défaut
    Dis-moi si
    Code :
    myDeleteDirectory(TEXT("d:\\Mesures\\Camera01"), true)marche.
    Le code marche bien... Moi non plus, je n'y comprends plus rien...

    bah il te reste toujours la méthode a l'ancienne :

    Code :
    BOOL EmptyDirectory(const char *szRep)
    {

    WIN32_FIND_DATA FindFileData;
    char path[MAX_PATH];

    ...
    }

    J'avais déjà implémenté la méthode à l'ancienne, beaucoup moins élégante... mais bon, du qui marche...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 18
    Par défaut
    Milles excuses pour cette réponse aussi tardive, mais priorités obligent...
    Voici un résumé de mon problème:
    Mon code de suppression de répertoire non vide est le suivant:
    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
     
    BOOL MyDeleteDirectory(LPCTSTR repertoire, BOOL suppressionDefinitive, CString &str) {
       str="no_err";
     
       SHFILEOPSTRUCT sh;
       sh.hwnd = NULL;
       sh.wFunc = FO_DELETE;
       sh.pFrom = repertoire;
     
       sh.pTo = NULL;
       sh.fFlags = FOF_NOCONFIRMATION|FOF_SILENT;
       if(!suppressionDefinitive)
          sh.fFlags |= FOF_ALLOWUNDO;
       sh.fAnyOperationsAborted = FALSE;
       sh.lpszProgressTitle = NULL;
       sh.hNameMappings = NULL;
       BOOL rep=SHFileOperation(&sh);
     
      if (rep) {
        DWORD err=GetLastError();
     
        LPVOID lpMsgBuf;
     
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
    							NULL, err,
    							MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
    							(LPTSTR) &lpMsgBuf,0,NULL );
     
        str.Format("%s", (LPCTSTR)lpMsgBuf);
     
        LocalFree(lpMsgBuf);
     
      }
     
       return (rep);
    }
    L'exéctution de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CString message;
    CString subRep("d:\\Mesures\\Camera01");
     
    MyDeleteDirectory((LPCTSTR)subRep,true, message);
    de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyDeleteDirectory(TEXT("d:\\Mesures\\Camera01"), true, message)
    de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyDeleteDirectory(subRep.GetBuffer(0),true, message);
    échoue et renvoie toujours la même erreur
    code 1026 (descripteur non valide)
    En revanche, si le chemin est en dur dans l'argument de ma fonction, l'exécution de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     MyDeleteDirectory("d:\\Mesures\\Camera01", true, message)
    supprime bien mon répertoire.

    Enfin, si je rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #if !defined(UNICODE) && defined(_UNICODE)
    #error MFC est en UNICODE mais pas Windows
    #endif
    #if defined(UNICODE) && !defined(_UNICODE)
    #error Windows est en UNICODE mais pas MFC
    #endif
    en haut de mon code, je compile sans problème...
    Si quelqu'un a la moindre idée ou explication, je suis preneur... merci

  9. #9
    Membre Expert
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Par défaut
    et ca ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CString subRep("d:\\\Mesures\\\Camera01");
     
                myDeleteDirectory((LPCTSTR)subRep,true);

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Normalement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyDeleteDirectory(TEXT("d:\\Mesures\\Camera01"), true, message)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyDeleteDirectory("d:\\Mesures\\Camera01", true, message)
    devraient fonctionner exactement de la même manière, ou au moins donner un warning.

    La fonction MyDeleteDirectory() et la fonction utilisatrice sont bien dans le même fichier source ?
    Si tu as un prototype de MyDeleteDirectory(), il est bien absolument identique à l'en-tête de la fonction ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 18
    Par défaut
    et ca ?
    Code :
    CString subRep("d:\\\Mesures\\\Camera01");

    myDeleteDirectory((LPCTSTR)subRep,true);
    ne marche toujours pas...
    En revanche,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyDeleteDirectory(TEXT("d:\\Mesures\\Camera01"), true, message)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyDeleteDirectory("d:\\Mesures\\Camera01", true, message)
    fonctionnent bien à l'identique. Que puis-je faire d'autre?

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À présent, tu peux tester si la chaîne retournée par une CString est bien identique à "d:\\Mesures\\Camera01" et à TEXT("d:\\Mesures\\Camera01")...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 18
    Par défaut
    À présent, tu peux tester si la chaîne retournée par une CString est bien identique à "d:\\Mesures\\Camera01" et à TEXT("d:\\Mesures\\Camera01")...
    L'exécution de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CString subRep("d:\\Mesures\\Camera01");
    int val=strcmp(subRep,"d:\\Mesures\\Camera01"),
    retourne 1. Idem avec TEXT("d:\\Mesures\\Camera01")...

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/03/2015, 09h09
  2. Réponses: 3
    Dernier message: 04/02/2010, 15h37
  3. suppression d'un répertoire non vide
    Par leame dans le forum MFC
    Réponses: 2
    Dernier message: 17/06/2009, 12h51
  4. supprimer répertoire non vide
    Par taly dans le forum Langage
    Réponses: 33
    Dernier message: 03/08/2006, 19h49

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