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

 C++ Discussion :

Problème avec GetFileTime


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Problème avec GetFileTime
    Bonjour,

    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
    #define fichier_en_entree "fichier.txt"
     
    int main(int argc, char *argv[])
    {
    	SYSTEMTIME date_actuelle;
    	FILETIME date_fichier_a;
    	SYSTEMTIME date_fichier_b;
     
    	GetSystemTime(&date_actuelle);
    	fichier_in = fopen(fichier_en_entree, "rb");
    	if (fichier_in == NULL)
    	{
    		printf("Impossible d'ouvrir le fichier fichier_en_entree\n");
    		return 1;
    	}
     
    	GetFileTime(fichier_in, NULL, NULL, &date_fichier_a); //date de modification
    	FileTimeToSystemTime(&date_fichier_a, &date_fichier_b);
     
    	printf("%d : %d : %d\n", date_actuelle.wYear, date_fichier_a, date_fichier_b.wYear);
     
    	return 0;
    }
    J'obtiens ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2013 : -858993460 : -858993460
    Avez-vous une idée d'où peut venir ce problème de date bizarre?

    Merci d'avance.

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    En fait la fonction GetFileTime() prend un HANDLE vers un fichier ouvert, et non pas un FILE* (comme retourné via fopen()).
    Pour obtenir un HANDLE, il faut utiliser CreateFile() (qui, malgré son nom, permet aussi d'ouvrir un fichier).

    Je ne sais pas quel compilateur tu utilises pour compiler ton programme, mais normalement Visual C++, par défaut, définit la constante STRICT, qui permet de ne pas laisser passer ce genre d'erreurs.
    Es-tu sûr de ne pas avoir vu passer un warning ou qqchose comme ça ?
    Aussi, je ne vois pas, dans ton source, de #include <windows.h>, j'en déduis que le source ci-dessus est incomplet ?

    Edit : je suis prêt à parier que la fonction GetFileTime() a échoué, et que GetLastError() t'aurait donné des informations pour t'aider à trouver l'origine du problème, mais tu ne testes pas la valeur de retour de GetFileTime().

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par phi1981 Voir le message
    En fait la fonction GetFileTime() prend un HANDLE vers un fichier ouvert, et non pas un FILE* (comme retourné via fopen()).
    Pour obtenir un HANDLE, il faut utiliser CreateFile() (qui, malgré son nom, permet aussi d'ouvrir un fichier).

    Je ne sais pas quel compilateur tu utilises pour compiler ton programme, mais normalement Visual C++, par défaut, définit la constante STRICT, qui permet de ne pas laisser passer ce genre d'erreurs.
    Es-tu sûr de ne pas avoir vu passer un warning ou qqchose comme ça ?
    Aussi, je ne vois pas, dans ton source, de #include <windows.h>, j'en déduis que le source ci-dessus est incomplet ?

    Edit : je suis prêt à parier que la fonction GetFileTime() a échoué, et que GetLastError() t'aurait donné des informations pour t'aider à trouver l'origine du problème, mais tu ne testes pas la valeur de retour de GetFileTime().
    Tu as raison sur pas mal de point:
    - J'utilise visual c++ 2010 express (mais je n'ai pas de warning)
    - il manque cette partie dans le code que j'ai indiqué, sinon ça marcherais beaucoup moins bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iconv.h>
    #include <windows.h>
    - Je ne testais pas le code retour de GetFileTime (mea culpa)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	if (!GetFileTime(fichier_in, NULL, NULL, &date_fichier_a))
    		printf("ko\n");
    	system("pause");
    Et ça affiche bien ko

    Je vais essayer d'utiliser CreateFile, pour l'instant je rame

  4. #4
    Invité
    Invité(e)
    Par défaut
    J'avais aussi fait une erreur dans le "FileTimeToSystemTime". Maintenant ça fonctionne mieux.
    Merci pour le coup de main.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
     
    int main(void)
    {
    	HANDLE h_fichier;
    	LPCWSTR fname = L"D:\\repertoire\\test.txt";
    	FILETIME date_fichier_tmp;
    	SYSTEMTIME date_fichier_utc, date_fichier_local;
     
    	//Ouverture du fichier
    	h_fichier = CreateFile(fname,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    	if(h_fichier == INVALID_HANDLE_VALUE)
    		printf("CreateFile ko %S\n", fname);
     
    	//Date de modification du fichier
    	if (!GetFileTime(h_fichier, NULL, NULL, &date_fichier_tmp))
    		printf("GetFileTime ko\n");
     
        //Convertion de la date
    	FileTimeToSystemTime(&date_fichier_tmp, &date_fichier_utc);
    	SystemTimeToTzSpecificLocalTime(NULL, &date_fichier_utc, &date_fichier_local);
    	printf("Derniere modification le %02d-%02d-%d %02dh%02d\n", date_fichier_local.wDay, date_fichier_local.wMonth, date_fichier_local.wYear, date_fichier_local.wHour, date_fichier_local.wMinute);
     
    	//Fermeture du fichier
    	CloseHandle(h_fichier);
     
    	system("pause");
    	return 0;
    }

  5. #5
    Invité
    Invité(e)
    Par défaut
    Par contre je me demandais ce qu'il était possible de faire avec un fichier ouvert via "CreateFile". S'agit-il des mêmes choses qu'avec ifstream ?

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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