Trier des fichiers d'une ListBox par date de modification

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

cartes1 Messages postés 33 Date d'inscription vendredi 25 mars 2005 Statut Membre Dernière intervention 16 janvier 2010
15 mars 2008 à 12:19
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
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 mars 2008 à 16:59
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++
0
cartes1 Messages postés 33 Date d'inscription vendredi 25 mars 2005 Statut Membre Dernière intervention 16 janvier 2010
15 mars 2008 à 09:08
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 mars 2008 à 09:24
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++
0
Rejoignez-nous