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

Résolu
cartes1 Messages postés 33 Date d'inscription vendredi 25 mars 2005 Statut Membre Dernière intervention 16 janvier 2010 - 19 mars 2008 à 08:14
cartes1 Messages postés 33 Date d'inscription vendredi 25 mars 2005 Statut Membre Dernière intervention 16 janvier 2010 - 20 mars 2008 à 06:35
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

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
19 mars 2008 à 21:05
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
3
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
19 mars 2008 à 11:13
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
0
cartes1 Messages postés 33 Date d'inscription vendredi 25 mars 2005 Statut Membre Dernière intervention 16 janvier 2010
19 mars 2008 à 18:11
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
0
cartes1 Messages postés 33 Date d'inscription vendredi 25 mars 2005 Statut Membre Dernière intervention 16 janvier 2010
20 mars 2008 à 06:35
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
0
Rejoignez-nous