[C++]Leggere/scrivere la data di creazione di un file

« Older   Newer »
  Share  
Brutus Wolf
view post Posted on 25/2/2012, 20:22




Un file è un contenitore di informazioni suddiviso in due parti: un header destinato a gestione attributi,data creazione,ecc.. e una seconda parte dove è memorizzato l’effettivo contenuto del file. Solitamente il sistema operativo si occupa della gestione della prima “zona” invece noi utenti possiamo solamente modificare la seconda.

In questo articolo, attraverso l’uso di alcune API di windows, vedremo come leggere/scrivere la data di creazione di un file. Ci tengo a precisare che in internet è pieno di ottimi programmini da utilizzare per questo scopo; ma secondo me è meglio farsi le cose che utilizzare quelle degli altri.

Detto questo siamo pronti.

Sotto windows per gestire le date vengono usate principalmente due strutture :

FILETIME

CODICE
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;


SYSTEMTIME

CODICE
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;


La prima memorizza le informazioni sommando i millisecondi a partire dal 1/1/1601, invece la seconda notazione utilizza un metodo più comprensibile basato su una data.

La funzione che ci permette di estrarre la data di creazione/ultima modifica/ultimo accesso è la seguente :

CODICE
BOOL WINAPI GetFileTime(
__in       HANDLE hFile,
__out_opt  LPFILETIME lpCreationTime,
__out_opt  LPFILETIME lpLastAccessTime,
__out_opt  LPFILETIME lpLastWriteTime
);


Ecco un programmino che la utilizza a pieno :

CODICE
#include <windows.h>
#include <iostream>

using namespace std;

/*
Brutus Wolf
http://brutuswolf.altervista.org/
*/

int main(){
FILETIME ftCreate; //struttura per memorizzare la data di creazione del file
SYSTEMTIME stUTC;  //struttura per memorizzare la data convertita
HANDLE f=CreateFile("prova.txt", GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, NULL); //apro il file
GetFileTime(f, &ftCreate, (LPFILETIME) NULL, (LPFILETIME) NULL); //leggo la data di creazione
FileTimeToSystemTime(&ftCreate, &stUTC); //rendo la data "comprensibile"
cout << stUTC.wHour+1 << ":" << stUTC.wMinute << " " << stUTC.wDay << "/" << stUTC.wMonth << "/" << stUTC.wYear;
// mostro la data a video
CloseHandle(f); //chiudo il file

system("pause");
return 0;
}


La funzione che invece bisogna utilizzare per scrivere questi dati è :

CODICE
BOOL WINAPI SetFileTime(
 __in      HANDLE hFile,
 __in_opt  const FILETIME *lpCreationTime,
 __in_opt  const FILETIME *lpLastAccessTime,
 __in_opt  const FILETIME *lpLastWriteTime
);


Quando modificate una data ricordatevi di inserire un anno successivo al 1601:

CODICE
#include <windows.h>
#include <iostream>

using namespace std;

/*
Brutus Wolf
http://brutuswolf.altervista.org/
*/

int main(){
FILETIME ftCreate; //struttura per memorizzare la data di creazione del file
SYSTEMTIME stUTC;  //struttura per memorizzare la data convertita
HANDLE f=CreateFile("prova.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, NULL); //apro il file in scrittura

uscita.wYear=2001; //scelgo l'anno
uscita.wMonth=12; //il mese
uscita.wDay=12; // il giorno
uscita.wHour=10; //l'ora
uscita.wMinute=10; // i minuri
uscita.wSecond=10; // i secondi
uscita.wMilliseconds=10; // i millisecondi

SystemTimeToFileTime(&uscita, &u); //converto l'ora in formato millisecondi
SetFileTime(f, &u, (LPFILETIME) NULL, (LPFILETIME) NULL); // cambio l'ora di creazione del file
CloseHandle(f); //chiudo il file

system("pause");
return 0;
}


[URL=http://brutuswolf.altervista.org/blog/2012/02/25/cleggerescrivere-la-data-di-creazione-di-un-file/]http://brutuswolf.altervista.org/blog/2012...one-di-un-file/
[/URL]
 
Top
0 replies since 25/2/2012, 20:22   53 views
  Share