[win32][c][dev-c++] auto list en html

Description

Bonjours a tous et toutes ^^

une petite source qui permet la génération automatique d'une liste de fichier sous forme de tableau en fichier html:

- liste des fichiers, puis répertoire avec leur taille + la durée (suivant les formats de fichiers)
- les formats de fichiers pour lesquelles la durée est affiché sont : AVI, DIVX, MP4, ASF, WMV, MOV, NSV

La source est un peu codé barbare je la mettrais à jour avec le temps :)

le binaire est présent;
renommer le fichier "AutoListHtml.exe_" par "AutoListHtml.exe"

j'attend vos remarques :p

Source / Exemple :


//------------------------------------------------------------------------------
// Projet AutoListHtml  : génération de liste automatique
// Auteur               : Hanteville Nicolas
// Fichier              : main.c
// Version              : 0.1
// Date de modification : 25/07/2008
// Site                 : http:\\omni.a.free.fr
//------------------------------------------------------------------------------
// gestion des includes
//------------------------------------------------------------------------------
#include "ressources.h"
//------------------------------------------------------------------------------
//emplacement de l'application en cours
void GetMyDirectory(char *path, unsigned int TAILLE)
{
  char *c = path+GetModuleFileName(0, path,TAILLE);
  while(*c != '\\') c--;
  c++;

  • c = 0;
} //------------------------------------------------------------------------------ //convertion de nombre hexa sur 8 caractères en decimal unsigned long HexaToDec(char *hexa,unsigned int taille) { unsigned long k=0;//resultat unsigned long j=1,i; // j =coef multiplicateur et i variable de boucle //traitement de la valeur hexa for (i=(taille-1);i>0;i--)//calcul de la valeur hexa en decimal { switch(hexa[i]) { case '1':k=k+j;break; case '2':k=k+(2*j);break; case '3':k=k+(3*j);break; case '4':k=k+(4*j);break; case '5':k=k+(5*j);break; case '6':k=k+(6*j);break; case '7':k=k+(7*j);break; case '8':k=k+(8*j);break; case '9':k=k+(9*j);break; case 'a':k=k+(10*j);break; case 'A':k=k+(10*j);break; case 'b':k=k+(11*j);break; case 'B':k=k+(11*j);break; case 'c':k=k+(12*j);break; case 'C':k=k+(12*j);break; case 'd':k=k+(13*j);break; case 'D':k=k+(13*j);break; case 'e':k=k+(14*j);break; case 'E':k=k+(14*j);break; case 'f':k=k+(15*j);break; case 'F':k=k+(15*j);break; }; j=j*16; }; return k; }; //------------------------------------------------------------------------------ //lecture de la durée du fichier suivant le type void LireDuree(char*fic,char*duree) { //http://www.codeproject.com/KB/audio-video/mpegaudioinfo.aspx unsigned short taille = strlen(fic); unsigned long int time=0, frame=0; unsigned long int final_time; DWORD lue; duree[0]=0; //OK: AVI, DIVX, MP4, ASF, WMV, MOV, NSV //identiques : AVI/MP4/DIVX // a faire : MP3/MPG/MPEG/MKV/OGG/RM/RMVB/FLV //MPG, FLV //MKV header Format //NSV if(fic[taille-3]=='.' && (fic[taille-2]=='n' || fic[taille-2]=='N') && (fic[taille-1]=='s' || fic[taille-1]=='S')) { //on recherche en 1er le logo NSVf ou NSVs pour spéficier si streaming ou encodé HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on lit les 512er octets char my_buffer[513]; SetFilePointer(Hfic,0,0,FILE_BEGIN);//on passe les 4er octets ReadFile(Hfic,my_buffer,512,&lue,0); //on test si un cmov (vidéo compressé) int i; BOOL ok = 1,stream=0; for (i=0;i<512 && ok;i++) { if (my_buffer[i] == 'N' && my_buffer[i+1] == 'S' && my_buffer[i+2] == 'V') { ok=0; if (my_buffer[i+3] == 's')stream=1; i--; } } if(ok) { //une video direct if(!stream) { char tmp[9]; sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+12]&255,my_buffer[i+13]&255,my_buffer[i+14]&255,my_buffer[i+15]&255); time = HexaToDec(tmp,8); if(time) { time = time/1000; if (time>1)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60); } }//sinon streaming enregistré non traité } } CloseHandle(Hfic); }else if(fic[taille-4]=='.') { if(fic[taille-3]=='a' || fic[taille-3]=='A') { //AVI if(fic[taille-1]=='i' || fic[taille-1]=='I') { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on passe les 32 1er octets SetFilePointer(Hfic,32,0,FILE_BEGIN); //temps entre les images ReadFile(Hfic,&time,4,&lue,0); //on passe les 12 octets suivants SetFilePointer(Hfic,12,0,FILE_CURRENT); //nombres d'images ReadFile(Hfic,&frame,4,&lue,0); if(time && frame) { //temps total en secondes (avant = microsecondes) final_time = (time*frame)/1000000; if (final_time>0)sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); } } CloseHandle(Hfic); //ASF }else if(fic[taille-1]=='f' || fic[taille-1]=='F') { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on passe les 24 1er octes SetFilePointer(Hfic,24,0,FILE_BEGIN); //on lit le nombre d'objets (entêtes) (4 octets) //ReadFile(Hfic,&frame,4,&lue,0); //on passe le nombre d'entête suivantes (256bits/) //on passe les 64 1er octets SetFilePointer(Hfic,/*(frame*32)+*/64+2+4,0,FILE_CURRENT); unsigned __int64 mytime; //durée ReadFile(Hfic,&mytime,8,&lue,0); if(mytime) { final_time = mytime/10000000; sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); } } CloseHandle(Hfic); } }else if(fic[taille-3]=='m' || fic[taille-3]=='M') { //MP4 if(fic[taille-1]=='4') { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on passe les 32 1er octets SetFilePointer(Hfic,32,0,FILE_BEGIN); //temps entre les images ReadFile(Hfic,&time,4,&lue,0); //on passe les 12 octets suivants SetFilePointer(Hfic,12,0,FILE_CURRENT); //nombres d'images ReadFile(Hfic,&frame,4,&lue,0); if(time && frame) { //temps total en secondes (avant = microsecondes) final_time = (time*frame)/1000000; if (final_time>0)sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); } } CloseHandle(Hfic); //MOV }else if(fic[taille-2]=='o' || fic[taille-2]=='O') { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on lit les 256er octets char my_buffer[257]; SetFilePointer(Hfic,0,0,FILE_BEGIN);//on passe les 4er octets ReadFile(Hfic,my_buffer,256,&lue,0); //on test si un cmov (vidéo compressé) int i; BOOL ok = 1; for (i=0;i<252 && ok;i++) { if (my_buffer[i] == 'c' && my_buffer[i+1] == 'm' && my_buffer[i+2] == 'o' && my_buffer[i+3] == 'v') { ok=0; } } if(ok) //une video non compressé { //on cherche mvhd = header video //on récupère sa position for (i=0;i<252 && ok;i++) { if (my_buffer[i] == 'm' && my_buffer[i+1] == 'v' && my_buffer[i+2] == 'h' && my_buffer[i+3] == 'd') { ok=0; i--; } } char tmp[9]; sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+16]&255,my_buffer[i+17]&255,my_buffer[i+18]&255,my_buffer[i+19]&255); frame = HexaToDec(tmp,8); sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+20]&255,my_buffer[i+21]&255,my_buffer[i+22]&255,my_buffer[i+23]&255); time = HexaToDec(tmp,8); if(frame && time) { time = time/frame; if (time>1)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60); } } } CloseHandle(Hfic); } }else if(fic[taille-3]=='w' || fic[taille-3]=='W') { //WMA et WMV = ASF + media compressé if(fic[taille-2]=='m' || fic[taille-2]=='M') { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on passe les 102 1er octes SetFilePointer(Hfic,102,0,FILE_BEGIN); unsigned __int64 mytime; //durée ReadFile(Hfic,&mytime,8,&lue,0); final_time = mytime/10000000; if (final_time > 36000 || final_time<1) { SetFilePointer(Hfic,442,0,FILE_BEGIN); ReadFile(Hfic,&mytime,8,&lue,0); final_time = mytime/10000000; if (final_time > 36000 || final_time<1) { SetFilePointer(Hfic,444,0,FILE_BEGIN); ReadFile(Hfic,&mytime,8,&lue,0); final_time = mytime/10000000; if (final_time > 36000 || final_time<1) { SetFilePointer(Hfic,14,0,FILE_BEGIN); ReadFile(Hfic,&mytime,8,&lue,0); final_time = mytime/10000000; if (final_time < 36000 && final_time>0) sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); } CloseHandle(Hfic); } } }else if (fic[taille-5]=='.') { //DIVX if ((fic[taille-4]=='d' || fic[taille-4]=='D') && (fic[taille-1]=='x' || fic[taille-1]=='X')) { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on passe les 32 1er octets SetFilePointer(Hfic,32,0,FILE_BEGIN); //temps entre les images ReadFile(Hfic,&time,4,&lue,0); //on passe les 12 octets suivants SetFilePointer(Hfic,12,0,FILE_CURRENT); //nombres d'images ReadFile(Hfic,&frame,4,&lue,0); if (time&&frame) { //temps total en secondes (avant = microsecondes) time = time*frame/1000000; if (final_time>0)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60); } } CloseHandle(Hfic); } } } //------------------------------------------------------------------------------ //liste des répertoires dans le répertoire principal BOOL ListItems(const char *fic,char *concat,HANDLE Hdest) { WIN32_FIND_DATA data; char Rep [MAX_PATH]; char Concat[MAX_PATH]; __int64 taille_fic; char duree[256]; char tmp[MAX_PATH]; DWORD copiee; BOOL ret=0; // les fichiers HANDLE hfic = FindFirstFile(fic, &data); if (hfic != INVALID_HANDLE_VALUE) { do { if(data.cFileName[0] != '.') { strcpy(Rep,fic); Rep[strlen(fic)-3]=0; strncat(Rep,data.cFileName,MAX_PATH); if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//si un répertoire { }else if (!(!strcmp(data.cFileName,"Thumbs.db")))//sinon un fichier (sauf si un thumb) { ret=1; strncat(Rep,"\0",MAX_PATH); //taille du fichier taille_fic = (data.nFileSizeHigh * MAXDWORD) + data.nFileSizeLow; //durée du fichier LireDuree(Rep,duree); //affichage if (taille_fic>1048576) //supérieur a 1 mo sprintf(tmp," <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%2.2fmo</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic/1048576.0,duree); else if (taille_fic>1024) //supérieur a 1 ko sprintf(tmp," <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%2.2fko</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic/1024.0,duree); else sprintf(tmp," <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%do</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic,duree); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); } } }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1 } FindClose(hfic); //les répertoires hfic = FindFirstFile(fic, &data); if (hfic != INVALID_HANDLE_VALUE) { do { if(data.cFileName[0] != '.') { strcpy(Rep,fic); Rep[strlen(fic)-3]=0; strncat(Rep,data.cFileName,MAX_PATH); if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//si un répertoire { //traitement redondance strncat(Rep,"\\*.*\0",MAX_PATH); if (concat[0]!=0) sprintf(Concat,"%s\\%s",concat,data.cFileName); else strcpy(Concat,data.cFileName); if(ListItems(Rep,Concat,Hdest)) { strcpy(tmp," <tr bgcolor=\"#DDDDDD\"><td colspan=\"4\"></td></tr>"); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); } } } }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1 } FindClose(hfic); return ret; } //------------------------------------------------------------------------------ //liste des items présents dans un répertoire void ListRep(const char *fic,HANDLE Hdest) { WIN32_FIND_DATA data; HANDLE hfic = FindFirstFile(fic, &data); char Rep [MAX_PATH]; char Concat[2]=""; __int64 taille_fic; char duree[10]; char tmp[MAX_PATH]; DWORD copiee; if (hfic != INVALID_HANDLE_VALUE) { do { if(data.cFileName[0] != '.') { strcpy(Rep,fic); Rep[strlen(fic)-3]=0; strncat(Rep,data.cFileName,MAX_PATH); if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(!strcmp("System Volume Information",data.cFileName)) && !(!strcmp("RECYCLER",data.cFileName)))//si un répertoire { strncat(Rep,"\\*.*\0",MAX_PATH); //impression du titre et début tableau sprintf(tmp," <H2>%s</H2>\r\n" " <table border=\"0\" cellspacing=\"2\" cellpadding=\"1\">\r\n" " <tr><td BGCOLOR=#DDDDDD><b>Genre/serie</b></td><td BGCOLOR=#DDDDDD><b>Fichier</b></td><td width=\"120px\" BGCOLOR=#DDDDDD><b>Taille</b></td><td width=\"120px\" BGCOLOR=#DDDDDD><b>Durée</b></td></tr>\r\n" ,data.cFileName); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); ListItems(Rep,Concat,Hdest); //fin du tableau sprintf(tmp," </table>\r\n <BR/>\r\n"); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); } } }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1 } FindClose(hfic); } //------------------------------------------------------------------------------ //génération de la liste DWORD WINAPI GenList(LPVOID lParam) { char rep[MAX_PATH]; char repInit[MAX_PATH]; char tmp[MAX_PATH]; DWORD copiee; unsigned int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0); if(max) { EnableWindow(H_start,0); //ouverture du fichier HANDLE Hdest= CreateFile(LIST_DEF,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hdest != INVALID_HANDLE_VALUE) { //début du fichier sprintf(tmp,"<html>\r\n"); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); while (max--) { SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)repInit); sprintf(tmp," <center><H1>%s</H1></center>\r\n",repInit); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); strncpy(rep,repInit,MAX_PATH); strncat(rep,"*.*\0",MAX_PATH); ListRep(rep,Hdest); //suppression du 1er item SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0); } //fin du fichier sprintf(tmp,"</html>\r\n"); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); } //fermeture du fichier CloseHandle(Hdest); //ouverture du fichier résultat GetMyDirectory(tmp,MAX_PATH); strncat(tmp,LIST_DEF,MAX_PATH); strncat(tmp,"\0",MAX_PATH); ShellExecute(NULL,"Open",tmp, NULL, NULL, SW_SHOWNORMAL); EnableWindow(H_start,0); } } //------------------------------------------------------------------------------ //gestion des appels et msg sur le fenêtre principale HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam) { HDROP H_DropInfo; int nb,i; switch(Msg) { case WM_INITDIALOG: InitCommonControls(); //récupération des handl généraux H_LST = GetDlgItem(hwnd,LST); H_start = GetDlgItem(hwnd,BT_START); //application d'une icone SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON))); break; case WM_CLOSE: EndDialog(hwnd,0); //PostQuitMessage(0); break; case WM_COMMAND : if ((LOWORD(Wparam) == BT_SUP) && (HIWORD(Wparam) == BN_CLICKED)) { unsigned int nb = SendMessage(H_LST,LB_GETSELCOUNT,(WPARAM)0,(LPARAM)0); if (nb>1) { //récupération des IDs des Items sélectionnés int Items[MAX_PATH]; if (SendMessage(H_LST,LB_GETSELITEMS,(WPARAM)MAX_PATH,(LPARAM)Items)!= LB_ERR) { for (i=nb-1;i>-1;i--) { SendMessage(H_LST,LB_DELETESTRING,(WPARAM)(const)Items[i],(LPARAM)0); } } }else { //suppression de la sélection int nb = SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0); if (nb>-1) { SendMessage(H_LST,LB_DELETESTRING,(WPARAM)nb,(LPARAM)0); if (nb-1 <0)SendMessage(H_LST,LB_SETSEL ,(WPARAM)TRUE,(LPARAM)0); else SendMessage(H_LST,LB_SETSEL ,(WPARAM)TRUE,(LPARAM)nb-1); } } }else if ((LOWORD(Wparam) == BT_START) && (HIWORD(Wparam) == BN_CLICKED)) { CreateThread(NULL, 0,GenList,0,0,0); }else if ((LOWORD(Wparam) == BT_A_PROPOS) && (HIWORD(Wparam) == BN_CLICKED)) { MessageBox(0,"AutoListHtml_V0.1 du 25/07/2008\n" "Par : Hanteville Nicolas\n" "Libre de droit et d'utilisations.\n" "Site Web : http:\\\\omni.a.free.fr" ,"A propos",MB_OK|MB_TOPMOST|MB_ICONINFORMATION); } break; case WM_DROPFILES: { char tmp[MAX_PATH]; //récupération de la liste des fichiers sélectionnés + traitemen H_DropInfo=(HDROP)Wparam;//récupération de la liste //traitement : nb de fichier en drag nb=DragQueryFile(H_DropInfo, 0xFFFFFFFF, NULL, 0 ); for (i=0;i<nb;i++) { DragQueryFile(H_DropInfo,i,tmp,DragQueryFile(H_DropInfo,i,0,0)+1 ); //récupération SendMessage(H_LST,LB_ADDSTRING,(WPARAM)0,(LPARAM)tmp); } DragFinish(H_DropInfo);//libération de la mémoire } break; } return 0; } //------------------------------------------------------------------------------ //fonction principal (main) int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow) { Hinst = hInst; //création de la fenêtre DialogBox(0,MAKEINTRESOURCE(AutoListHtml),GetDesktopWindow(),(DLGPROC)DlgProc); return 0; }

Codes Sources

A voir également

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.