Récupérer séparément Nom et Chemin d'un fichier

[Résolu]
Signaler
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010
-
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010
-
Bonjour
Avec Visual studio C++ 6 en Api pur, je n'arrive pas à récupérer séparément le nom d'un fichier d'un côté et le chemin de l'autre ( sans le nom du fichier) à partir d'une structure OPENFILENAME pour pouvoir les inscrire dans deux controles Edit différents.
Merci d'avance pour les réponses.
Voici le code simplifié:

/***********************************************************************************************/
bool TrouveFichier(HWND hwnd, char* CheminFichier, char*  NomFichier)
/**********************************************************************************************/
{
    OPENFILENAME ofn;
   
    ZeroMemory(&ofn, sizeof(ofn));
    CheminFichier[0] = 0;
   
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFilter = "Fichiers de Type (*.pdf)\0*.pdf;*.cmd\0\0";
    ofn.lpstrFile = CheminFichier;
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrFileTitle = NomFichier;
    ofn.lpstrDefExt = "pdf";
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY ;
    if(!GetOpenFileName(&ofn))
        return false;
    return true;
}
///////////
LRESULT CALLBACK ProcedurePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
switch (message)
    {
   case WM_COMMAND:
      UINT NumeroId = LOWORD(wParam);
       switch(NumeroId)
           {
          case ID_BUTTON3:
            GetWindowText(hEditCheminPDF, CheminFichier,strlen(CheminFichier));
            if(TrouveFichier(fenetrePrincipale, CheminFichier, NomFichier))
               {
             SetWindowText(hEditCheminPDF, CheminFichier);
             SetWindowText(hEditFichierPDF, NomFichier);
               }
          break;
            }
}
////////////////////////////////////////////////////////////////////////////////////
Cartes1

4 réponses

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Pas de quoi !

SHBrowseForFolder() est du même genre que GetOpenFileName() dans TrouverFichier() mais permet de sélectionner un répertoire et non un fichier dans un répertoire. Je l'utilise de cette façon (avec l'include de shlobj.h) :

bool TrouverRépertoire
(
    HWND        hWnd     // E:handle de la fenêtre parent
   ,LPSTR       pszDir   // E/S:répertoire
   ,const char* pszTitle // I:titre
)                        // O:répertoire modifié (ou erreur)
{
   char szSelection[MAX_PATH];

   BROWSEINFO bi;
   bi.hwndOwner      = hWnd;
   bi.pidlRoot       = NULL;
   bi.pszDisplayName = szSelection;
   bi.lpszTitle      = (LPCTSTR)pszTitle;
   bi.ulFlags        = BIF_NEWDIALOGSTYLE; // | BIF_EDITBOX;
   bi.lpfn           = 0;
   bi.lParam         = 0;
  
   LPITEMIDLIST pidlBrowse = SHBrowseForFolder(&bi);
   if (pidlBrowse == NULL) return false;



   if (SHGetPathFromIDList(pidlBrowse,szSelection) == FALSE) return false;
   lstrcpy(pszDir,szSelection);
   return true;
}








Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Bonjour,

Voici ce que j'utilise (adapté avec le code proposé avec un petit main() pour tester) :

bool TrouverFichier
(
    HWND        hWnd          // E:handle sur la fenêtre
   ,const char* CheminInitial // E:répertoire de départ
   ,char*       CheminFichier // S:répertoire du fichier sélectionné
   ,char*       NomFichier    // S:nom du fichier sélectionné
)                             // S:sélection réalisée
{
   CheminFichier[0] = 0;



   OPENFILENAME ofn;
   ZeroMemory(&ofn,sizeof(OPENFILENAME));
   ofn.lStructSize     = sizeof(OPENFILENAME);
   ofn.hwndOwner       = hWnd;
   ofn.lpstrFilter     = "Fichiers PDF (*.pdf)\0*.pdf\0\0";
   ofn.lpstrFile       = CheminFichier;
   ofn.nMaxFile        = MAX_PATH;
   ofn.lpstrFileTitle  = NomFichier;
   ofn.nMaxFileTitle   = MAX_PATH;
   ofn.lpstrInitialDir = CheminInitial;
   ofn.lpstrDefExt     = "pdf";
   ofn.Flags           = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY ;
   if (! GetOpenFileName(&ofn)) return false;
   strcpy(CheminFichier,ofn.lpstrFile);
   CheminFichier[ofn.nFileOffset] = 0; // supprimer le nom derrière le chemin
   strcpy(NomFichier,ofn.lpstrFileTitle);
   return true;
}



void main()
{
   char CheminInitial[MAX_PATH] = {"D:\\DEV_DOC\\Win32"};
   char CheminFichier[MAX_PATH] = {0};
   char NomFichier[MAX_PATH]    = {0};
   if (TrouverFichier(NULL,CheminInitial,CheminFichier,NomFichier))
   {
      printf("Repertoire : %s\n",CheminFichier);
      printf("Fichier    : %s\n",NomFichier);
   }
}




Jean-François
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010

Bonsoir jfrancois
Merci beaucoup, ça marche super.


j'ai une autre question en rapport avec celle-ci:


Je voudrais remplacer ma Listbox (avec une liste de fichiers) dans ma fenêtre principale en liste de répertoires et fichiers. Est-ce que l'on peut utiliser la fonction Api Windows SHBrowseForFolder? J'ai essayé mais je n'arrive pas à passer de la fenêtre crée avec cette fonction à ma fenêtre principale (j'utilise deux "Dlgprocedure"  différentes) car la fermeture de l'une entraine la fermeture de l'autre.
merci d'avance

Cartes1
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010

Bonjour jfrancois
Maintenant j'ai toutes les clés en main pour finir mon programme.
encore une fois un grand merci et à bientôt.
Cartes1