Convertir FILETIME en time_t [Résolu]

Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- - Dernière réponse : SAKingdom
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
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

 
Afficher la suite 

Votre réponse

20/30 réponses

Meilleure réponse
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Dernière intervention
4 mars 2010
3
Merci
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
}

Merci cs_juju12 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de cs_juju12
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Dernière intervention
16 février 2009
3
Merci
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++ (@++)<!--

Merci SAKingdom 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de SAKingdom
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
3
Merci
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++

Merci BruNews 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de BruNews
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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

 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Dernière intervention
4 mars 2010
0
Merci
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().
Commenter la réponse de cs_juju12
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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....

 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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

 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
rectification :   if(SystemTime.wDay > t.tm_mday)

devient   if(SystemTime.wDay < t.tm_mday)

 
Commenter la réponse de LaTatadu91
Messages postés
198
Date d'inscription
vendredi 4 avril 2003
Dernière intervention
18 mars 2011
0
Merci
#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;
}
Commenter la réponse de cs_magma
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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!

 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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.....

 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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

 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Dernière intervention
4 mars 2010
0
Merci
Je vais jeter un coup d'oeil, bizarre...
Commenter la réponse de cs_juju12
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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;
    }       

 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Dernière intervention
4 mars 2010
0
Merci
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é.
Commenter la réponse de cs_juju12
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
oui il trouve bien mon fichier vu que le champ cFileName a bien le nom de mon fichier...

 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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

 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
comparefiletime me donne 1 dans mon cas

 
Commenter la réponse de LaTatadu91
Messages postés
198
Date d'inscription
vendredi 4 avril 2003
Dernière intervention
18 mars 2011
0
Merci
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);
Commenter la réponse de cs_magma
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Dernière intervention
4 mars 2010
0
Merci
tu peux me donner les valeurs de ftLimitTime.dwHighDateTime et IpFindFileData.ftCreationTime.dwHighDateTime?
Commenter la réponse de cs_juju12

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.