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

API, COM et SDKs Delphi Discussion :

[D2010] Modifier les dates d'un fichier avec SetFileTime


Sujet :

API, COM et SDKs Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut [D2010] Modifier les dates d'un fichier avec SetFileTime
    Je cherche à donner à un fichier B les mêmes dates qu'un fichier A.
    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
    var
       HandleSource, HandleDest: THandle;
       DateCreation, DateModification, DateAcces: TFileTime;
    begin
       // Ouverture du fichier source.
       HandleSource := FileOpen(szFichierSource, fmOpenRead or fmShareDenyNone);
       try
          if HandleSource = 0 then
             Exit;
     
          // Récupération des dates du fichier source.
          if not GetFileTime(HandleSource, @DateCreation, @DateAcces, @DateModification) then
          begin
             szErreur := #9 + 'Erreur :  la récupération des dates du fichier source [' + szFichierSource + '] a échoué !' + #13#10#9 + SysErrorMessage(GetLastError);
             Exit;
          end;
       finally
          FileClose(HandleSource);
       end;
     
       // Ouverture du fichier destination.
       HandleDest := FileOpen(szFichierDest, fmOpenReadWrite or fmShareExclusive);
       try
          if HandleDest = 0 then
             Exit;
     
          // Modification des dates du fichier destination.
          if not SetFileTime(HandleDest, @DateCreation, @DateAcces, @DateModification) then
          begin
             szErreur := #9 + 'Erreur :  la modification des date du fichier destination [' + szFichierDest + '] a échoué !' + #13#10#9 + SysErrorMessage(GetLastError);
             Exit;
          end;
       finally
          FileClose(HandleDest);
       end;
    Et j'obtiens une erreur sur SetFileTime:
    Descripteur non valide
    J'ai trouvé d'autres posts sur SetFileTime, mais je ne vois pas ce que j'ai mal fait (je suis sous D2010).

    Une idée ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 217
    Points
    25 217
    Par défaut
    Essaye comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HandleDest := CreateFile(PChar(szFichierDest), FILE_WRITE_ATTRIBUTES,
          0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HandleDest := FileOpen(szFichierDest, fmOpenWrite or fmShareExclusive);
    ou même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HandleDest := FileOpen(szFichierDest, fmOpenWrite);
    fmOpenWrite au lieu fmOpenReadWrite, après tout, tu ne veux pas lire le fichier, juste modifier les attributs !

    j'aime beaucoup le sz de szFichierDest pour "zero-terminated string" en notation hongroise, alors que c'est je suppose UnicodeString qui est bien plus qu'une chaine terminée par un Double zéro !
    Tu savais que ce n'est pas recommandé des règles de codage !

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Essaye comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HandleDest := CreateFile(PChar(szFichierDest), FILE_WRITE_ATTRIBUTES,
          0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    Je n'ai pas trouvé la définition de FILE_WRITE_ATTRIBUTES. Je me suis rabattu sur GENERIC_WRITE.
    Ca me donne la même erreur.

    Citation Envoyé par ShaiLeTroll Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HandleDest := FileOpen(szFichierDest, fmOpenWrite or fmShareExclusive);
    Même erreur.

    Citation Envoyé par ShaiLeTroll Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HandleDest := FileOpen(szFichierDest, fmOpenWrite);
    fmOpenWrite au lieu fmOpenReadWrite, après tout, tu ne veux pas lire le fichier, juste modifier les attributs !
    Même erreur.
    snif

    Le problème doit être ailleur.
    (Bien sûr, le fichier en question existe bien, et je n'ai pas de problème de droits)

    Citation Envoyé par ShaiLeTroll Voir le message
    j'aime beaucoup le sz de szFichierDest pour "zero-terminated string" en notation hongroise, alors que c'est je suppose UnicodeString qui est bien plus qu'une chaine terminée par un Double zéro !
    Tu savais que ce n'est pas recommandé des règles de codage !
    J'utilise cette notation (depuis plus de 10 ans), car je n'aime pas me demander de quel type sont mes variables (je les préfixe toutes).

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 217
    Points
    25 217
    Par défaut
    Que donne FileSetDate(FileName, Age), si elle ne passe pas non plus, ça vient des droits sur le fichier, même si tu penses ne pas en avoir !?

    ah, c'est l'avantage d'être en C++Builder 2007, on a bien plus de header qu'en Delphi

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    #define FILE_WRITE_ATTRIBUTES     ( 0x0100 )    // all

    En XE2, ils ont rattrapés ce retard dans "...\source\rtl\win\Winapi.Windows.pas"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      FILE_WRITE_ATTRIBUTES     = $0100;    // all
      {$EXTERNALSYM FILE_WRITE_ATTRIBUTES}
    as-tu tenté ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if not SetFileTime(HandleDest, @DateCreation, nil, nil) then
    toutes variantes, de nil nil nil à @ @ @, peut-être que l'une des valeurs est refusée !

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    as-tu tenté ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not SetFileTime(HandleDest, @DateCreation, nil, nil) then
    toutes variantes, de nil nil nil à @ @ @, peut-être que l'une des valeurs est refusée !
    Oui, j'avais testé avec la date de modification seule.

    Citation Envoyé par ShaiLeTroll Voir le message
    En XE2, ils ont rattrapés ce retard dans "...\source\rtl\win\Winapi.Windows.pas"
    Bonne nouvelle. Va falloir que je l'installe (j'ai une licence qui moisie ).

    Je viens de trouver le lien sur la msdn (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HandleDest := CreateFile(PChar(szFichierDest), FILE_WRITE_ATTRIBUTES, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    Ca marche !!

    C'est étonnant quand même.
    Ca veut dire que quand j'utilise FILE_GENERIC_WRITE, c'est l'un de ces droits que je n'ai pas ?
    FILE_APPEND_DATA
    FILE_WRITE_ATTRIBUTES
    FILE_WRITE_DATA
    FILE_WRITE_EA
    STANDARD_RIGHTS_WRITE
    SYNCHRONIZE

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/05/2016, 12h26
  2. Réponses: 8
    Dernier message: 29/04/2015, 17h01
  3. Réponses: 3
    Dernier message: 12/09/2005, 16h38
  4. comment modifier les attributs d'un fichier?
    Par kamal101 dans le forum C++
    Réponses: 1
    Dernier message: 18/03/2005, 14h16
  5. Réponses: 4
    Dernier message: 24/08/2004, 13h54

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