IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

CompareFileTime() me retourne une valeur fausse


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut CompareFileTime() me retourne une valeur fausse
    Bonjour à tous

    Je veux comparer les dates de deux fichiers à la seconde près. Or, L'API CompareFileTime() me retourne une réponse fausse. Je dois mal l'interpréter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Variable globales :
     
      Nom_F1, Nom_F2 : string;
      Creation_F1, Der_Acces_F1, Der_Ecriture_F1 : TFileTime;
      Creation_F2, Der_Acces_F2, Der_Ecriture_F2 : TFileTime;
      Chn_Resultat_Comparaison_Dates : string;  // Pr vérifier  le résultat ds un mémo
    Je lis les dates des fichiers, j'appelle la comparaison, et j'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    procedure TForm1.Btn_1Click(Sender: TObject);
    begin
          Lire_Date_F;
          Comparer_Dates;
          Aff_Dates_Fichiers; 
    end;
    
    Procedure Lire_Date_F;
    Var   Handle_F : integer;
          Retour_GetFileTime : boolean; 
    
    begin
          //  Creation_F1, Der_Acces_F1, Der_Ecriture_F1 : TFileTime;
    
          Handle_F := FileOPen(Nom_F1, GENERIC_READ);
          Retour_GetFileTime  := GetFileTime(Handle_F, @Creation_F1, @Der_Acces_F1, @Der_Ecriture_F1);
          FileClose(Handle_F);
    
          Handle_F := FileOPen(Nom_F2, GENERIC_READ);
          Retour_GetFileTime := GetFileTime(Handle_F, @Creation_F2, @Der_Acces_F2, @Der_Ecriture_F2);
          FileClose(Handle_F);
    
    end;
    
    Procedure Comparer_Dates;
    Var  Retour_Comparaison : LongInt;
    
    begin
    
          // LONG WINAPI CompareFileTime(   _In_  const FILETIME *lpFileTime1,   _In_  const FILETIME *lpFileTime2 );
    			// CompareFileTime() est ici : https://msdn.microsoft.com/en-us/library/windows/desktop/ms724214%28v=vs.85%29.aspx
    
          Retour_Comparaison := CompareFileTime(Der_Ecriture_F1, Der_Ecriture_F2);
    
          CASE Retour_Comparaison OF
              0 :
                  begin
                        Chn_Resultat_Comparaison_Dates := Nom_F1 + ' et ' + Nom_F2 +'ont le MEME AGE';
                  end;
              -1 :
                  begin
                        Chn_Resultat_Comparaison_Dates := Nom_F1 + ' plus RECENT que ' + ExtractFileName(Nom_F2);
                  end;
              1 :
                  begin
                        Chn_Resultat_Comparaison_Dates := Nom_F1 + ' plus ANCIEN que ' + ExtractFileName(Nom_F2);
                       // C'est ici que c'est faux : dernier accès dans le fichier 1 : aujourd'hui
                  end;
    
          END; // Case
    
    end;
    
    // Pour convertir la date des fichiers en date affichable (string) :
    Function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
    var ModifiedTime: TFileTime;
    		SystemTime: TSystemTime;
    		
    begin
    			try
    				FileTimeToLocalFileTime(FileTime, ModifiedTime);
    				FileTimeToSystemTime(ModifiedTime, SystemTime);
    				Result := SystemTimeToDateTime(SystemTime);
    			except
    				Result := Now; // Si une erreur se produit
    			end;
    end;
    Où est-ce que je me plante ?

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    D'abord, tu ne nous dis pas en quoi tu n'obtiens pas le résultat auquel tu t'attends, donc difficile de te répondre...

    Ensuite, et ça explique peut-être le point précédent, tu écris que tu "veux comparer les dates de deux fichiers à la seconde près" alors que le msdn nous dit ici : "FILETIME structure : Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC)". La précision en retour de comparaison semble donc supérieure à ce que tu attends.

    [EDIT] N'est-il pas possible que tu te trompes aussi dans l'interprétation du résultat : ton lien nous dit : "1 : First file time is later than second file time" que je lis comme "le premier fichier est plus tardif, donc, pour moi, plus récent".
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Je vais essayer d'expliquer.

    Je veux comparer deux dates : la dernière modification effectuée sur deux fichiers (qui porteront le même nom, dans mon programme : l'un sur un disque source, l'autre une disque de destination). Je veux savoir si le fichier a été modifié ou non. J'appelle donc GetFileTime() pour avoir la date du dernier accès disque dans une structure de type TFileTime .

    Or, lorsque je teste ma routine, je vois que CompareFileTime() me retourne que le fichier .zip, qui est ancien, est plus récent que le fichier Unit1.pas qui, lui, est d'aujourd'hui.

    Je me plante donc quelque part.

    Je ne sais pas si je suis clair

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par bvsud Voir le message
    Je me plante donc quelque part.
    En effet, et plus particulièrement dans votre compréhension de l'API...

    Il est dit :
    Return value Description
    -1 First file time is earlier than second file time. Mot à mot : Le temps du 1° fichier est plus tôt que celui du second fichier soit Le 1° fichier est plus ancien que le second
    0 First file time is equal to second file time.
    1 First file time is later than second file time. Mot à mot : Le temps du 1° fichier est plus tardif que celui du second fichier soit Le 1° fichier est plus récent que le second

    Vous l'avez inversement traduit...

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Oh ! Bon Dieu !!

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/11/2013, 13h46
  2. [VB.Net]Procédure Stocké retournant une valeur
    Par waldo2188 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 03/05/2005, 12h56
  3. Réponses: 7
    Dernier message: 15/03/2005, 14h44
  4. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45
  5. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo