Convertir FILETIME en time_t

Résolu
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

 
A voir également:

30 réponses

Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
ftLimitTime.dwHighDateTime=ftLimitTime.dwHighDateTime-6018;
donne : 29869629

et
IpFindFileData.ftCreationTime.dwHighDateTime
donne: 29875640

 
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Bon excuse moi d'insister mais t'es sûr que le fichier est vieux d'un mois? parce que si on convertit en SYSTEMTIME il dit qu'il date du 1er aout a peu pres.
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
et pourtant dans mon repertoire j'ai 3 fichiers deux créés vendredi
et un créé il y a 3 mois que je viens de copier coller dedans ...

 
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
mouais... est-ce-que le répertoire s'appelle comme le fichier testé par hasard?
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Et tant qu'à faire si tu peux mettre le code avec FindFirstFile....
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
ben ecoute le repertoire s'appelle trace com/
et la je viens de tester avec un fichier texte créé en 2004 qd mm et pareil ca ne marche pas....

code complet:
void PurgeTrace()
{
    HANDLE hdlfff;
    SYSTEMTIME SystemTime;
    bool erase = false;
    FILETIME ft;
    time_t   diff_en_secondes;
    __int64 t1,t2;

    //On va lister tout les programmes et repertoires du disque C:\
    //Pour lister juste les .txt par exemple mettre: c:\\*.txt
    //Ou sinon tout les fichier qui ont comme nom file  c:\\file.*

    LPCTSTR dir = "C:\\RTOP\\INSTAL\\trace com\\*.txt";
    //structure nécéssaire pour FindFirstFile() et FindNextFile()
    WIN32_FIND_DATA IpFindFileData;

    //la on initialise la variable hdlfff a la fonction FindFirstFile
    hdlfff = FindFirstFile(dir,&IpFindFileData);

    //premier fichier qu'il faut afficher avant la fonction FindNextFile qui ne
    //comprend pas le 1er fichier
    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;
    }       
    //Tant que le prochain fichier n'est pas égale a 0
    while (FindNextFile(hdlfff,&IpFindFileData))
    {
        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(&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;
        }
    }
    //A la fin du programme  fermeture le HANDLE
    FindClose(hdlfff);
}

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
j'ai 4fichiers maintenant 2 nouveaux et deux vieux ....
alors a moins que le copier coller n'est une influence je n'y comprends rien ....

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
re,

je comprends pas je viens d'essayer le code de SAkingdom et il ne se passe toujours rien mes fichiers ne sont pas éffacés!

désolé ...

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Bon a priori j'avais raison en faisant un copier coller de mes vieux fichiers ca devait changer la date de création et du coup forcément pour lui ca faisait moins d'un mois , a priori ca marche avec le code de SAkingdom
pour en etre sur j'ai juste changer le dir vers un repertoire ancien et c'est bon
PS: 30jours 2592000 30*24*3600

merci a  tous pour cette prise de tete collective ;-)

 
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Je te conseille fortement d'utiliser la méthode de BruNews. On évitera ainsi de faire appel à __allshl et __alldiv.

#define MONTH 25920000000000

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

  GetSystemTimeAsFileTime((FILETIME*)&systime);

  do {
    ULARGE_INTEGER filetime;

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

    filetime.LowPart = fd.ftCreationTime.dwLowDateTime;
    filetime.HighPart = fd.ftCreationTime.dwHighDateTime;

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

  CloseHandle(hFind);

  return 0;
}

C++ (@++)<!--