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++;
}
//------------------------------------------------------------------------------
//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;
}
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.