Trier des fichiers d'une ListBox par date de modification [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
malgré mes recherches sur le forum et sur internet je n'ai pas trouvé le moyen de trier les fichiers d'une ListBox par date de modification en Api Pur (j'utilise C++ Visual Studio6 ). ce code ne m'affiche qu'un seul fichier dans la Listbox et c'est le premier par ordre alphabètique.

Voici mon code:
///////////////////////////////////////////////
// Fonction d'extraction de la date et de l'heure de modification
/****************************************************************************************************/
char* test(FILETIME Temp)
/*****************************************************************************************************/
{
char* Chaine=new char;
SYSTEMTIME stTemp,stLocal;
FileTimeToSystemTime(&Temp,&stTemp);
SystemTimeToTzSpecificLocalTime(NULL,&stTemp,&stLocal);
wsprintf(Chaine,"%02d/%02d/%d %02d:%02d",stLocal.wDay ,stLocal.wMonth ,stLocal.wYear,stLocal.wHour ,stLocal.wMinute );
return Chaine;
}
///////////////////////////////////////////////////////////////////////////////////////
/////   Fonction qui Liste les Fichiers "PDF" par Date de Modification   //////////////////////////////////////
/****************************************************************************************/
void AfficherListeFichiersParDate (char Dossier[MAX_PATH])
/****************************************************************************************/
{
HANDLE hFind;
WIN32_FIND_DATA FindData;
char*  Chaine=NULL;

 // Change de dossier
SetCurrentDirectory (Dossier); 

 // Début de la recherche
 hFind=FindFirstFile ("*.pdf", &FindData); 
 
if (hFind!=INVALID_HANDLE_VALUE)
{
 Chaine = test(FindData.ftLastWriteTime);
      {
  // Si le fichier trouvé n'est pas un dossier mais bien un fichier, on affiche son nom 
  if (!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
            {
  SendDlgItemMessage(fenetrePrincipale, ID_LISTBOX_PDF, LB_ADDSTRING, 0, (LONG)strcat(Chaine,FindData.cFileName));
            }
  // Fichiers suivants
  while (FindNextFile (hFind, &FindData)) 
      {
Chaine=test(FindData.ftLastWriteTime);
   //if (!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
       {
   SendDlgItemMessage(fenetrePrincipale, ID_LISTBOX_PDF, LB_ADDSTRING, 0, (LONG)strcat(Chaine,FindData.cFileName));
       }
   }
  }
 // Fin de la recherche
 }
return;
}
////////////////
Merci d'avance.
Cartes1

4 réponses

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

Rebonjour BruNews
C'était pourtant logique mais je n'y avais même pas pensé.
Encore un grand Merci pour ton aide sympa et à bientôt.

Cartes1
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
DEMO avec simplement une listbox sur une dialog.

#include <windows.h>
#include "resource.h"


HWND hlb = 0;


__declspec(naked) DWORD __fastcall bnDatFltFl(LPFILETIME lpft)
{
  __asm {
    mov     edx, [ecx+4]
    mov     eax, [ecx]
    mov     ecx, edx
    shr     eax, 2
    shl     ecx, 30
    shr     edx, 2
    or      eax, ecx
    push    edx
    push    eax
    fild    qword ptr[esp]
    fstp    dword ptr[esp]
    pop     eax
    pop     edx
    ret     0
  }
}


void ListeFichiersParDateModif(char *pdir, char *pfltr)
{
  WIN32_FIND_DATA wfd;
  HANDLE hfl;
  char *pbuf, *d;
  DWORD len, data, v;
  int pos, count;
  SendMessage(hlb, LB_RESETCONTENT, 0, 0);
  len = strlen(pdir);
  if(!len) return;
  len += strlen(pfltr);
  pbuf = (char*) HeapAlloc(GetProcessHeap(), 0, len + 2);
  if(!pbuf) return;
  d = pbuf;
  while(*d = *pdir) {pdir++; d++;}  if(*(d-1) !'\\') *d++ '\\';
  strcpy(d, pfltr);
  hfl = FindFirstFile(pbuf, &wfd);
  HeapFree(GetProcessHeap(), 0, pbuf);
  if(hfl == INVALID_HANDLE_VALUE) return;
  count = 0; // NBR ITEMS DANS LISTBOX
goFILES:
  if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) goto nextFL;
  data = bnDatFltFl(&wfd.ftLastWriteTime);
  for(pos = 0; pos < count; pos++) {
    v = SendMessage(hlb, LB_GETITEMDATA, pos, 0);
    if(data <= v) break;
  }
  SendMessage(hlb, LB_INSERTSTRING, pos, (LPARAM) wfd.cFileName);
  SendMessage(hlb, LB_SETITEMDATA, pos, (LPARAM) data);
  count++;
nextFL:
  if(FindNextFile(hfl, &wfd)) goto goFILES;
filesEND: FindClose(hfl);
}


BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  switch(mssg) {
    case WM_INITDIALOG:
      SetClassLongPtr(hdlg, GCLP_HICON, (long)LoadIcon(0, IDI_APPLICATION));
      hlb = GetDlgItem(hdlg, IDLB_FLS);
      ListeFichiersParDateModif("D:", "*.*");
      return 1;
    case WM_COMMAND:
      if(wParam == IDCANCEL) EndDialog(hdlg, 0);
  }
  return 0;
}

ciao...
BruNews, MVP VC++
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010

Bonjour BruNews


Merci beaucoup, ça marche, mais le seul problème est que je voudrais que le premier fichier de la liste soit le dernier fichier enregistré dans le dossier concerné ou bien si c'est trop compliqué mettre en surbrillance ce fichier : en effet je n'arrive pas à récupérer l'index de ce fichier pour pouvoir l'afficher dans un champ edit.
Merci encore
Cartes1
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
void ListeFichiersParDateModif(char *pdir, char *pfltr)
{
  WIN32_FIND_DATA wfd;
  HANDLE hfl;
  char *pbuf, *d;
  DWORD len, data, v;
  int pos, count;
  SendMessage(hlb, LB_RESETCONTENT, 0, 0);
  len = strlen(pdir);
  if(!len) return;
  len += strlen(pfltr);
  pbuf = (char*) HeapAlloc(GetProcessHeap(), 0, len + 2);
  if(!pbuf) return;
  d = pbuf;
  while(*d = *pdir) {pdir++; d++;}  if(*(d-1) !'\\') *d++ '\\';
  strcpy(d, pfltr);
  hfl = FindFirstFile(pbuf, &wfd);
  HeapFree(GetProcessHeap(), 0, pbuf);
  if(hfl == INVALID_HANDLE_VALUE) return;
  count = 0; // NBR ITEMS DANS LISTBOX
goFILES:
  if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) goto nextFL;
  data = bnDatFltFl(&wfd.ftLastWriteTime);
  for(pos = 0; pos < count; pos++) {
    v = SendMessage(hlb, LB_GETITEMDATA, pos, 0);
    //if(data <= v) break; // CROISSANT SUR DATE
    if(data >= v) break; // DECROISSANT SUR DATE
  }
  SendMessage(hlb, LB_INSERTSTRING, pos, (LPARAM) wfd.cFileName);
  SendMessage(hlb, LB_SETITEMDATA, pos, (LPARAM) data);
  count++;
nextFL:
  if(FindNextFile(hfl, &wfd)) goto goFILES;
  SendMessage(hlb, LB_SETCURSEL, 0, 0);
  FindClose(hfl);
}

ciao...
BruNews, MVP VC++