Convertir FILETIME en time_t [Résolu]

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

30 réponses

Répondre au sujet
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 13 août 2007 à 15:06
+3
Utile
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
}
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_juju12
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 13 août 2007 à 18:37
+3
Utile
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++ (@++)<!--
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de SAKingdom
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 13 août 2007 à 23:11
+3
Utile
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++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BruNews
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 11:41
0
Utile
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
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 13 août 2007 à 12:09
0
Utile
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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 13:14
0
Utile
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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 13:55
0
Utile
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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 14:12
0
Utile
rectification :   if(SystemTime.wDay > t.tm_mday)

devient   if(SystemTime.wDay < t.tm_mday)

 
Commenter la réponse de LaTatadu91
cs_magma 198 Messages postés vendredi 4 avril 2003Date d'inscription 18 mars 2011 Dernière intervention - 13 août 2007 à 16:18
0
Utile
#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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 16:41
0
Utile
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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 16:45
0
Utile
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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 17:02
0
Utile
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
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 13 août 2007 à 17:04
0
Utile
Je vais jeter un coup d'oeil, bizarre...
Commenter la réponse de cs_juju12
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 17:09
0
Utile
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
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 13 août 2007 à 17:11
0
Utile
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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 17:14
0
Utile
oui il trouve bien mon fichier vu que le champ cFileName a bien le nom de mon fichier...

 
Commenter la réponse de LaTatadu91
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 17:19
0
Utile
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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 août 2007 à 17:23
0
Utile
comparefiletime me donne 1 dans mon cas

 
Commenter la réponse de LaTatadu91
cs_magma 198 Messages postés vendredi 4 avril 2003Date d'inscription 18 mars 2011 Dernière intervention - 13 août 2007 à 17:25
0
Utile
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
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 13 août 2007 à 17:27
0
Utile
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.

convertir FILETIME en time_t - page 2