Convertir FILETIME en time_t

Résolu
Signaler
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Salut,

Voila mon probleme je recupere la date de cration d'un fichier via FindFirstFile(dir,&IpFindFileData);
FILETIME tim = IpFindFileData.ftCreationTime;

et j'aimerais faire une comparaison avec le temps courant et si le fichier est plus vieux d'un mois je l'efface...
habituellement  j'utilise pour ce genre de chose la fonction difftime
mais elel prend un argument 2 time_t

alors voila je cherche a convertir le filetime en time_t afin de pouvoir faire la soustraction entre les deux temps ....

ps : je ne suis aps contre d'autres idées si il y en a ...
Merci

 

30 réponses

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
D'accord mais j'entendais comparer avec une date pré-calculée d'un mois avant:

FILETIME ftLimitTime;
GetSystemTimeAsFileTime(&ftLimitTime);
ftLimitTime.dwHighDateTime=ftLimitTime.dwHighDateTime-6018; // précis à une minute a peu près j'ai compté 30 jours/mois
if(CompareFileTime(&ftFromFile,&ftLimitTime)<0)
 {
...// détruit le fichier
}
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Ceci fonctionne très bien pour moi:

__inline __int64 FileTimeTo64i (FILETIME ft) {
  return (((__int64)ft.dwHighDateTime << 32)|ft.dwLowDateTime)/10000000;
}

#define MONTH 2592000 // 30 jours

int __cdecl main (void)
{
  WIN32_FIND_DATA fd;
  HANDLE hFind = FindFirstFile("C:\\*", &fd);
  FILETIME systime;

  GetSystemTimeAsFileTime(&systime);

  do {
    __int64 diff;

    if((fd.cFileName[0] == '.' && !fd.cFileName[1]) ||
            (fd.cFileName[0] == '.' && fd.cFileName[1] == '.' && !fd.cFileName[2])) continue;

    diff = FileTimeTo64i(systime)-FileTimeTo64i(fd.ftCreationTime);
    if(diff >= (__int64)MONTH) {
      printf("%s\n", fd.cFileName);
    }
  } while(FindNextFile(hFind, &fd));

  CloseHandle(hFind);

  return 0;
}

C++ (@++)<!--
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
On va remplacer '<< 32' et '/ 10000000' par 2 '='.


30 jours =  25920000000000


J'ai utilisé un DateTimePicker sur une dialog pour tester.


Je fais stocker direct les valeurs dans des __int64.
void __stdcall DireDate(HWND hdlg)
{
  SYSTEMTIME sttm;
  unsigned __int64 systm, srctm;
  SendMessage(hdtp, DTM_GETSYSTEMTIME, 0, (LPARAM) &sttm);
  SystemTimeToFileTime(&sttm, (LPFILETIME) &srctm);
  GetSystemTimeAsFileTime((LPFILETIME) &systm);
  if(srctm > systm) return;
  if((systm - srctm) >= 25920000000000) MessageBox(hdlg, "1 mois", szappname, 0);
}




Maintenant utilisons ULARGE_INTEGER pour y stocker le FILETIME comme si on le recevait d'un WIN32_FIND_DATA, se fait en 2 simple affectation.
void __stdcall DireDate(HWND hdlg)
{
  FILETIME ftm;
  SYSTEMTIME sttm;
  ULARGE_INTEGER systm, srctm;
  SendMessage(hdtp, DTM_GETSYSTEMTIME, 0, (LPARAM) &sttm);
  SystemTimeToFileTime(&sttm, &ftm); // VRAI FILETIME CETTE FOIS
  srctm.LowPart = ftm.dwLowDateTime;
  srctm.HighPart = ftm.dwHighDateTime;
  GetSystemTimeAsFileTime((LPFILETIME) &systm);
  if(srctm.QuadPart > systm.QuadPart) return;
  if((systm.QuadPart - srctm.QuadPart) >= 25920000000000) MessageBox(hdlg, "1 mois", szappname, 0);
}

ciao...
BruNews, MVP VC++
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
j'ai essayer ca mais

double dif=difftime(current_time,IpFindFileData.ftCreationTime.dwHighDateTime);

mais il me donne 37ans alors que mon fichier n'a que 3jours et 37ans ca correspond au 1er janvier 1970 (comme par hasard)

bref j'avance pas

 
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Tu peux utiliser CompareFileTime() qui prend deux FILETIME en argument; pour le temps courant tu peux le récupérer en SYSTEMTIME avec GetSystemTime() puis le convertir en FILETIME avec SystemTimeToFileTime().
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
a  priori c'est bon ce que tu m'as dit mais ce n'est pas ce que j'attends car la fonction CompareFileTime() renvoit 1,0,-1
si c'est egal inf, ou sup mais on sait pas de combien supérieur...
moi dans mes conditions il faut que ca soit supérieur a l'equivalent d'un mois (en sec ou autre)

du coup la ma condition n'est plus respéctée....

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Voici la petite bidouille que j'ai faite :

FILETIME tim = IpFindFileData.ftCreationTime;
    FileTimeToSystemTime(&tim,&SystemTime);
    time_t current_time;
    time(&current_time);
   
    struct tm t;
    localtime_s( &t, &current_time);
    //ajustement pour le mois de janvier
    if(t.tm_mon == 0)
        t.tm_mon = 12;
    //on rentre que pour le mois avant le mois courant
    if(SystemTime.wMonth == t.tm_mon )//attention t.tm_mon (0-->11) et SystemTime.wMonth(1-->12)
    {
        if(SystemTime.wDay > t.tm_mday)
        {
            char  dir_file[100] = "C:\";
            strcat(dir_file,IpFindFileData.cFileName);
            if( DeleteFile( dir_file ) != 0 )
                erase =true;
        }
    }
    else if (SystemTime.wMonth <= t.tm_mon -1)//pour les jours non éffacés a cause des mois en 30j ou 28
    {
        char  dir_file[100] = "C:\";
        strcat(dir_file,IpFindFileData.cFileName);
        if( DeleteFile( dir_file ) != 0 )
            erase =true;
    }

a priori mes fichiers seront bien éffacés pas toujours au bon moment(pour les fichiers datant du 31 par ex) mais c'est pas bien grave...

je vois pas trop comment faire sinon :-s

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
rectification :   if(SystemTime.wDay > t.tm_mday)

devient   if(SystemTime.wDay < t.tm_mday)

 
Messages postés
198
Date d'inscription
vendredi 4 avril 2003
Statut
Membre
Dernière intervention
18 mars 2011
1
#include <windows.h>

//----------------------------------------------------------
// Conversion d'une structure FILETIME en nombre de secondes
//----------------------------------------------------------
__int64 Filetime2int64(FILETIME ft)
{
return (__int64)
((((__int64)ft.dwHighDateTime << 32) | ft.dwLowDateTime)) /
10000000LL;
}

//----------------------------------------------------------
int WINAPI WinMain(HINSTANCE a, HINSTANCE b, LPSTR c, int d)
{
FILETIME ft;
char buf[512];
__int64 t1, t2;

GetSystemTimeAsFileTime(&ft);
t1 = Filetime2int64(ft);

Sleep(2000); // 2 secondes

GetSystemTimeAsFileTime(&ft);
t2 = Filetime2int64(ft);

wsprintf(buf, "Avant Sleep() (t1) %I64d secondes\n"
"Après Sleep() (t2) %I64d secondes\n"
"Différence entre t1 et t2 = %I64d secondes",
t1, t2, t2-t1);

MessageBox(0, buf, "", 0);
return 0;
}
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
ca a l'air de amrcher mais n'yant pas de fichier ayant plus d'un mois il est difficile de faire un test concret .... a voir

merci bcp!

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
je reviens sur ce que je disais juju12: ca ne amrche pas j'ai récupérer un vieux fichier txt que j'ai mis dans mon repertoire
et il ne passe aps dans la condition du comparefiletime.....

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
bon j'ai essayer ta fonction magama  avec ac:
       GetSystemTimeAsFileTime(&ft);
        t1 = Filetime2int64(ft);
        time_t current_time;
        time(&current_time);
       if(difftime(current_time,t1)>2592000)      //2592000 sec = 30jours

et il en passe jamais dans ma boucle pareil :-s

 
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Je vais jeter un coup d'oeil, bizarre...
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
pour la solution de magma il me donne
 pour t1                   -->12831490780
et pour current_time -->1187017162

du coup c'est mort par contre pour ta solution je ne sais pas pourquoi mais il ne rentre jamais :
    FILETIME ftLimitTime;
    GetSystemTimeAsFileTime(&ftLimitTime);
    ftLimitTime.dwHighDateTime=ftLimitTime.dwHighDateTime-6018; // précis à une minute a peu près pour 30 jours/mois
    if(CompareFileTime(&IpFindFileData.ftCreationTime,&ftLimitTime)<0)
    {
        char  dir_file[100] = "C:\\RTOP\\CORUS RAIL\\INSTAL\\trace com\";
        strcat(dir_file,IpFindFileData.cFileName);
        if( DeleteFile( dir_file ) != 0 )
            erase =true;
    }       

 
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Tu veux bien vérifier que FindFirstFile trouve bien le fichier? Si ca rate ca retourne 0xFFFFFFFF, et tous les champs de la structure WIN32_FIND_DATA sont à 0xCCCCCCCC donc c'est normal que ca ne marche pas. Je l'ai testé après avoir vérifié que le fichier avait été trouvé et ca a marché.
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
oui il trouve bien mon fichier vu que le champ cFileName a bien le nom de mon fichier...

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
par contre pour la solutiond e magma je m'étais emmeler les pinceaux comme on dit

il fallait aps prendre le current_-time mais ceci:
    GetSystemTimeAsFileTime(&ft);
        t1 = Filetime2int64(ft);
        t2 = Filetime2int64(IpFindFileData.ftCreationTime);
        if(difftime(t1,t2)>2592000)
        {
            char  dir_file[100] = "C:\\RTOP\\CORUS RAIL\\INSTAL\\trace com\";
            strcat(dir_file,IpFindFileData.cFileName);
            if( DeleteFile( dir_file ) != 0 )
                erase =true;
        }       

et ben ca ne marche pas non plus ... je capte pas pourquoi

et pour toi juju cela ne marche aps : if(CompareFileTime(&IpFindFileData.ftCreationTime,&ftLimitTime)<0)
il ne rentre pas dans le if

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
comparefiletime me donne 1 dans mon cas

 
Messages postés
198
Date d'inscription
vendredi 4 avril 2003
Statut
Membre
Dernière intervention
18 mars 2011
1
FILETIME ft_du_fichier;
FILETIME ft_current_time;
time_t diff_en_secondes;
__int64 t1, t2;

...
...

t1 = Filetime2int64(ft_du_fichier);
t2 = Filetime2int64(ft_current_time);
diff_en_secondes = (time_t)(t2 - t1);
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
tu peux me donner les valeurs de ftLimitTime.dwHighDateTime et IpFindFileData.ftCreationTime.dwHighDateTime?