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]