Convertir FILETIME en time_t

Résolu
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 13 août 2007 à 10:46
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 14 août 2007 à 14:49
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

 
A voir également:

30 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
13 août 2007 à 15:06
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
}
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 août 2007 à 18:37
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++ (@++)<!--
3
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2007 à 23:11
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++
3
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 11:41
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

 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
13 août 2007 à 12:09
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().
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 13:14
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....

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 13:55
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

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 14:12
rectification :   if(SystemTime.wDay > t.tm_mday)

devient   if(SystemTime.wDay < t.tm_mday)

 
0
cs_magma Messages postés 198 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 18 mars 2011 1
13 août 2007 à 16:18
#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;
}
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 16:41
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!

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 16:45
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.....

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 17:02
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

 
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
13 août 2007 à 17:04
Je vais jeter un coup d'oeil, bizarre...
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 17:09
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;
    }       

 
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
13 août 2007 à 17:11
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é.
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 17:14
oui il trouve bien mon fichier vu que le champ cFileName a bien le nom de mon fichier...

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 17:19
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

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 août 2007 à 17:23
comparefiletime me donne 1 dans mon cas

 
0
cs_magma Messages postés 198 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 18 mars 2011 1
13 août 2007 à 17:25
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);
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
13 août 2007 à 17:27
tu peux me donner les valeurs de ftLimitTime.dwHighDateTime et IpFindFileData.ftCreationTime.dwHighDateTime?
0
Rejoignez-nous