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 :

libérer un dossier après utilisation des APIs de recherche de fichiers, FindFirstFile et FindClose


Sujet :

C++

  1. #1
    Inscrit
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Points : 60
    Points
    60
    Par défaut libérer un dossier après utilisation des APIs de recherche de fichiers, FindFirstFile et FindClose
    bonjour à tous,

    J'ai développer le programme suivant pour extraire le nom d'un dossier et ça fonctionne convenablement:
    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
     
    //Path of the working directory
      const char * l_strPath;
      HANDLE hFind;
      WIN32_FIND_DATA FindFileData;
     
      l_strPath = i_strWorkingDirectory.c_str();
      try
      {
        SetCurrentDirectory (l_strPath);
        hFind = FindFirstFile("*.*", &FindFileData);
        while (FindNextFile (hFind, &FindFileData))
        {
          if (strcmp(FindFileData.cFileName,".")!=0 &&
            strcmp(FindFileData.cFileName,"..")!=0 && 
            FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
          {
            o_strFSDFEDirectory = FindFileData.cFileName;
          }
        }
      }
      catch(ETMException& )
      {
        cout << "FSDFE directory doesn't exist << endl;
      }
    Le problème c'est que je peux plus faire aucune modification (renommage ou suppression) sur le dossier dans la suite du programme.

    Est ce qu'il y a un moyen pour libérer le dossier après utilisation des APIs de recherche de fichiers, FindFirstFile et FindClose????

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Bin, déjà, commencez par utiliser "FindClose".

    P.S. : le while à la fin d'une boucle do, et pas une boucle while.
    P.P.S. : Vérifiez les valeurs de retour.

  3. #3
    Inscrit
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Points : 60
    Points
    60
    Par défaut libérer un dossier après utilisation de la fonction SetCurrentDirectory
    Oui j'ai oublier de mettre FindClose (hFind) après la boucle while.
    Mais ça ne résout pas le problème. Le code est devenu comme suit:

    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
     
    //Path of the working directory
      const char * l_strPath;
      HANDLE hFind;
      WIN32_FIND_DATA FindFileData;
     
      l_strPath = i_strWorkingFSDFEDirectory.c_str();
      try
      {
        SetCurrentDirectory (l_strPath);
        hFind = FindFirstFile("*.*", &FindFileData);
        while (FindNextFile (hFind, &FindFileData))
        {
          if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
          {
            o_strFSDFEFileName = FindFileData.cFileName;
          }
        }
        FindClose (hFind);
      }
      catch(...)
      {
        cout << "the file doesn't exist << endl;
      }
    Je croix que le problème en fait est du à l'utilisation de la fonction SetCurrentDirectory (l_strPath);

    Est ce qu'il y a une méthode qui permet de libérer le dossier après l'avoir choisit comme dossier courant??

    Merci!

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Vous n'avez pas tenu compte de mes PS.

    Il vous manquera toujours le premier "fichier" dans votre scan.
    Un répertoire qui est le répertoire de travail d'un processus ne peut pas être supprimé ni renommé tant que l'exécutable s'exécute ou ne change pas de répertoire de travail.
    N'utilisez pas "SetCurrentDirectory" dans ce cas, est même dans les autres, car changer le répertoire de travail est une opération qui est loin d'être anodine.

    Regarder cet exemple qui utilise la concaténation de chaîne pour construire sa chaîne de recherche.
    http://cboard.cprogramming.com/windo...dnextfile.html

  5. #5
    Inscrit
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Points : 60
    Points
    60
    Par défaut
    J'ai changé le code comme suit et le problème est résolu

    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
     
    //Path of the working directory
      const char * l_strPath;
      HANDLE l_hFind;
      WIN32_FIND_DATA l_FindFileData;
      DWORD l_dwErrorCode  = 0;
     
      i_strWorkingFSDFEDirectory += "\\*.*";
      l_strPath = i_strWorkingFSDFEDirectory.c_str();
      try
      {
        l_hFind = FindFirstFile(l_strPath, &l_FindFileData);
        while (ERROR_NO_MORE_FILES != l_dwErrorCode &&
          ERROR_INVALID_HANDLE != l_dwErrorCode)
        {
          if (FALSE == FindNextFile(l_hFind, &l_FindFileData))
          {
            l_dwErrorCode = GetLastError();
          }
          else
          {
            if (!(l_FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
            {
              o_strFSDFEFileName = l_FindFileData.cFileName;
            }
          }
        }
        FindClose (l_hFind);
      }
      catch(...)
      {
        cout << "the file doesn't exist << endl;
      }

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

Discussions similaires

  1. [dll] libérer une dll apres utilisation
    Par polo54 dans le forum API standards et tierces
    Réponses: 12
    Dernier message: 11/07/2009, 22h48
  2. [VB.Net][Fichier ini] utilisation des API
    Par DonF dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/03/2009, 14h32
  3. Libérer la mémoire aprés utilisation de collection
    Par harris_macken dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 27/03/2008, 00h01
  4. "Access violation" apres utilisation des compos BD
    Par bahaa dans le forum Bases de données
    Réponses: 1
    Dernier message: 06/10/2005, 07h59
  5. Utilisation des API MySQL // ADO ou BDE ? (sujet 2)
    Par rohstev dans le forum C++Builder
    Réponses: 8
    Dernier message: 07/11/2003, 10h50

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