[Prog] Jouer avec les dates de modification de fichier en langage C

Répondre
Partager Rechercher
J'ai un problème avec des lecture et modif de dates de fichier, en langage C (winapi32?)... Pour résumer j'aurai besoin de savoir comment lire la date de modif d'un fichier, et une fois fait je voudrai réenregistrer les infos de date a l'identique. J'ai a ma disposition le path+nom du fichier (que je reçoit en paramètre sous forme de char * et un FILE * (retour de fopen) que je déclare et instancie en local

Je patauge compl?ment avec les * les & les FILE les HANDLE les FILETIME les LPFILETIME GetFileTime et SetFileTime, quelqu'un saurait m'aider?
(Ou au pire me réorienter vers des forums spécialisés en programmation C )
man 2 fstat

Pour reenregistrer en modifiant la date de derniere modification je ne sais pas trop si tu peux sans changer l'heure a une date posterieure de maniere provisoire (ce qui enervera rapidement tes utilisateurs en introduisant une derive anormale dans l'horloge).
En fait j'ajoute dans un fichier binaire des informations Creator et Type du fs MacOS à partir d'un PC pour le rendre explicitement lisible sur Mac, mais je voudrais faire ça sans modifier la date de modification du fichier, car ça me pause problème ailleurs.
C'est pas trop compliqué en fait, mais faut pas passer par fopen puisqu'il faut un handle de fichier ouvert en GENERIC_READ ou WRITE.

Citation :

#include <assert.h>

HANDLE hFile;
FILETIME creat;
FILETIME lastaccess;
FILETIME lastwrite;
int result;


hFile = CreateFile([path du fichier], GENERIC_READ, FILE_SHARE_DELETE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

assert(hFile != INVALID_HANDLE_VALUE);

//recupere les anciennes date
result = GetFileTime (hFile, &creat, &lastaccess, &lastwrite);

assert(result);

CloseHandle(hFile);


blabla ...
Modif du fichier
blablaa....


hFile = CreateFile([path du fichier], GENERIC_WRITE, FILE_SHARE_DELETE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

assert(hFile != INVALID_HANDLE_VALUE);


result = SetFileTime (hFile, &creat, &lastaccess, &lastwrite);

assert(result);

CloseHandle(hFile);
Et le tour est joué
Raaaah merci beaucoup, tu viens de me faire gagner un temps précieux ! Je me plantait sur le CreateFile.

Maintenant une grande question... si je remplace fopen par CreateFile, ma lib sera toujours compatible PC, Mac et Unix en même temps ?

Booon bon ok ok je ressort mes #ifdef
Citation :
Provient du message de Oracle
Raaaah merci beaucoup, tu viens de me faire gagner un temps précieux ! Je me plantait sur le CreateFile.

Maintenant une grande question... si je remplace fopen par CreateFile, ma lib sera toujours compatible PC, Mac et Unix en même temps ?
merci de ne pas confondre Windows et PC, c'est différent

sinon m'étonnerait qu'un truc pareil marche sous UNIX, en tous cas jamais vu de CreateFile. (d'ailleurs c'est bizarre un nom de fonction avec majuscules, en général en C la convention est de mettre les noms en minuscules...)
d'ailleurs c'est dans quelle bibliothèque ce CreateFile ? je vois pas de #include associé...
Citation :
Provient du message de Lango Silma
merci de ne pas confondre Windows et PC, c'est différent
Merci de me le rappeler (note que tu peux mettre du Linux sur un Mac également )

Plateforme SDK ? Je ne vais pas me compliquer la vie, ça sent le #ifdef WIN32 ça
Citation :
Provient du message de Oracle
(note que tu peux mettre du Linux sur un Mac également )
certes, mais l'amalgame Mac = MacOS me gène moins, on peut considérer que c'est juste une abbréviation

par contre abbréger Windows en PC... à moins d'avoir vraiment beaucoup bu et ingéré en grande quantité des substances illicites...
tient pour ton #ifdef POSIX


Code:
#include <sys/types.h>
#include <utime.h>
#include <sys/stat.h>
#include <errno.h>

#define qerror(s) (perror(s), exit(-errno))

// blablabla 

int main(void)
{
  char *srcfilename = "/home/toto/totoorig.fic";
  char *dstfilename = "/home/toto/totomodif.fic";
  struct stat stats;
  struct utimbuf times;

//... 
  if(stat(srcfilename, & stats) < 0) qerror("stat");

  times.actime = stats.st_atime; /* date de dernier acces (que tu recuperes avec fstat sur ton fichier original donc */
  times.modtime = stats.st_mtime /* date de derniere modification (idem)
  if(utime(dstfilename, & times) < 0) qerror("utime"); 

//...
Possible, MacOS X est censé etre basé sur Unix si j'ai bien compris, mais ce qui m'intéressait c'etait MacOS Classic

THINK Reference est plus bavard que la MSDN de Microsoft
Si c'est pour utiliser le code sur plusieurs plateforme, utilise la routine de mothra et pas le createfile. toutes les plateforme sont posix meme windows , faut seulement rajouter un underscore devant le nom des fonction C pour windows genre _stats ou _utime
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés