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

cartes1 33 Messages postés vendredi 25 mars 2005Date d'inscription 16 janvier 2010 Dernière intervention - 19 mars 2008 à 08:14 - Dernière réponse : cartes1 33 Messages postés vendredi 25 mars 2005Date d'inscription 16 janvier 2010 Dernière intervention
- 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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 19 mars 2008 à 21:05
3
Merci
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

Merci cs_jfrancois 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 73 internautes ce mois-ci

Commenter la réponse de cs_jfrancois
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 19 mars 2008 à 11:13
0
Merci
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
Commenter la réponse de cs_jfrancois
cartes1 33 Messages postés vendredi 25 mars 2005Date d'inscription 16 janvier 2010 Dernière intervention - 19 mars 2008 à 18:11
0
Merci
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
Commenter la réponse de cartes1
cartes1 33 Messages postés vendredi 25 mars 2005Date d'inscription 16 janvier 2010 Dernière intervention - 20 mars 2008 à 06:35
0
Merci
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
Commenter la réponse de cartes1

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.