Ir al contenido


Foto

[MULTILENGUAJE] Conocer la fecha de creación de un fichero


  • Por favor identifícate para responder
13 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.963 mensajes
  • LocationMadrid - España

Escrito 27 abril 2010 - 01:44

En ocasiones queremos conocer cuando se creó un fichero y no cuando se modificó por última vez. Para saber este dato podemos usar esta función:



delphi
  1. function GetCreationFileDate(FileName: String): TDate;
  2. var
  3.   FileData:  WIN32_FILE_ATTRIBUTE_DATA;
  4.   SystemTime: TSYSTEMTIME;
  5. begin
  6.   GetFileAttributesEx(PCHAR(FileName), GetFileExInfoStandard, @FileData);
  7.   FileTimeToSystemTime(FileData.ftCreationTime, SystemTime);
  8.   Result:= EncodeDate(SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay);
  9. end;



O en C/C++:


cpp
  1. TDate GetCreationFileDate(char* FileName)
  2. {
  3.   WIN32_FILE_ATTRIBUTE_DATA FileData;
  4.   SYSTEMTIME SystemTime;
  5.   GetFileAttributesEx(FileName, GetFileExInfoStandard, &FileData);
  6.   FileTimeToSystemTime(&FileData.ftCreationTime, &SystemTime);
  7.   return EncodeDate(SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay);
  8. }



Saludos.

PD: Edito para colocar prefijo [MULTILENGUAJE]
  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 27 abril 2010 - 02:05

Yo lo hago así:


delphi
  1. function GetFileModifyDate(FileName: string): TDateTime;
  2. var
  3.   SearchRec: TSearchRec;
  4. begin 
  5.   if FindFirst(Filename,faAnyFile,SearchRec) = 0 then
  6.     Result:= FileDateToDateTime(SearchRec.Time)
  7.   else
  8.     Result:= 0;
  9.   FindClose(SearchRec);
  10. end;



Que viene siendo lo mismo  :cheesy:
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 27 abril 2010 - 02:25

Muchas gracias a ambos :) (y)
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.963 mensajes
  • LocationMadrid - España

Escrito 27 abril 2010 - 02:29

Gracias a tí, enecumene.

seoane, el código que propones ¿no encuentra la fecha de modificación?. El mio encuentra la fecha de creación del fichero. Ambos son útiles, pero distintos. (y)

Saludos.
  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 27 abril 2010 - 03:43

seoane, el código que propones ¿no encuentra la fecha de modificación?

Exacto, es la fecha de modificación.

Pero si quieres la de creación, usamos un poco de "copy&paste"  :D


delphi
  1. function GetFileCreationTime(FileName: string): TDateTime;
  2. var
  3.   SearchRec: TSearchRec;
  4.   LocalFileTime: TFileTime;
  5.   T: Integer;
  6. begin
  7.   if FindFirst(Filename,faAnyFile,SearchRec) = 0 then
  8.   begin
  9.     FileTimeToLocalFileTime(SearchRec.FindData.ftCreationTime, LocalFileTime);
  10.     FileTimeToDosDateTime(LocalFileTime, LongRec(T).Hi, LongRec(T).Lo);
  11.     Result:= FileDateToDateTime(T)
  12.   end else
  13.     Result:= 0;
  14.   FindClose(SearchRec);
  15. end;


  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 abril 2010 - 04:07

Hola,
Se podría decir que existen muchos caminos para llegar a Roma :D :)

Esto me hizo acordar a algo que se dijo en un congreso sobre peritaje informático hace unos años.
El expositor dio un ejemplo sencillo de como determinar si algún archivo fue adulterado basándonos en las fechas de los archivos. Es sabido que si uno copia un archivo viejo, y lo pega en otro lugar (no necesariamente) se crea dicha copia con la fecha actual, claro está. El asunto es que se modifica la fecha de creación y no la de modificación y de ese modo se puede comprobar si alguien se quiso hacer el listo. Por ejemplo:

Original
Creado: 17/04/2007
Modificado: 17/04/2007

Copia:
Creado: 27/04/2010
Modificado: 17/04/2007

Alguien más vivo dirá que se altera la hora del equipo previamente y listo... pero... resulta ser que ahora el resto de los archivos con los que habitualmente trabajan siguen teniendo la fecha actual. Con lo cual habría cierta incoherencia.

Formateamos, ponemos la fecha y hora y listo, el engaño resultó....¿O no? Mi pregunta, filosófica, que me surge ahora (no se porqué no se me ocurrió en el congreso) ¿Qué se podría hacer para determinar si realmente la fecha de creación es la que dice ser y no una anterior?

El ejemplo es hipotético, no tengo nada malo planeado por si se preguntan.

Saludos,
  • 0

#7 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 27 abril 2010 - 04:59

Recuerdo que hace algún tiempo unos conocidos metieron la pata a la hora de configurar un equipo dentro de un sistema de ficheros en red (...) resumiendo que adelantaron la fecha de modificación de todos los ficheros en 6 horas. Eso que para muchos de nosotros seria una simple anécdota resulto ser para ellos toda una hecatombe, ya que los archivos pertenecían al departamento de contabilidad y ellos usaban ese dato para controlar el acceso a esos ficheros (algo completamente estúpido como se vera mas adelante).

El caso es que pensaron en toda una serie de soluciones a cada cual mas exótica, hasta que les sugerí que simplemente pusieran la fecha correcta a cada fichero. No se como no se les había ocurrido antes, la solución era tan sencilla como leer la fecha actual del fichero, restarle 6 horas y volverla a escribir  :D

Todavía recuerdo lo asombrados que se quedaron, siendo como eran señores licenciados en informática, al ver que un programa de pocas lineas podía cambiar la fecha de todos los archivos en pocos segundos  :D
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.177 mensajes
  • LocationMéxico

Escrito 27 abril 2010 - 06:36

Recuerdo que hace algún tiempo unos conocidos metieron la pata a la hora de configurar un equipo dentro de un sistema de ficheros en red (...) resumiendo que adelantaron la fecha de modificación de todos los ficheros en 6 horas. Eso que para muchos de nosotros seria una simple anécdota resulto ser para ellos toda una hecatombe, ya que los archivos pertenecían al departamento de contabilidad y ellos usaban ese dato para controlar el acceso a esos ficheros (algo completamente estúpido como se vera mas adelante).

El caso es que pensaron en toda una serie de soluciones a cada cual mas exótica, hasta que les sugerí que simplemente pusieran la fecha correcta a cada fichero. No se como no se les había ocurrido antes, la solución era tan sencilla como leer la fecha actual del fichero, restarle 6 horas y volverla a escribir  :D

Todavía recuerdo lo asombrados que se quedaron, siendo como eran señores licenciados en informática, al ver que un programa de pocas lineas podía cambiar la fecha de todos los archivos en pocos segundos  :D


Vaya que cosas, suele pasar :D :D :D

Salud OS
  • 0

#9 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.963 mensajes
  • LocationMadrid - España

Escrito 28 abril 2010 - 01:04

Todavía recuerdo lo asombrados que se quedaron, siendo como eran señores licenciados en informática, al ver que un programa de pocas lineas podía cambiar la fecha de todos los archivos en pocos segundos  :D


No por ser licenciado se conocen los temas a fondo ni se tiene la experiencia y, mas aún, la picardía o astucia propia de los maestros. :D

Saludos.
  • 0

#10 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.963 mensajes
  • LocationMadrid - España

Escrito 28 abril 2010 - 04:48

¿Qué se podría hacer para determinar si realmente la fecha de creación es la que dice ser y no una anterior?


Salvando el tema de la incongruencia entre fecha de creación y de modificación del archivo, no se me ocurre otro método que escribir la fecha de creación en el propio archivo. :(

Saludos.
  • 0

#11 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.963 mensajes
  • LocationMadrid - España

Escrito 27 marzo 2011 - 07:09

Me acordé este hilo cuando respondí a una pregunta referente a la fecha de modificación de un fichero en C, en otro foro.


Aunque seoane implementó una forma de hacerlo, yo lo hice distinto, de forma coherente a como inicié este hilo. Así, para enriquecer el asunto, expongo el código en C/C++ y delphi.



[cpp]
TDate GetModifyFileDate(char* FileName)
{
  WIN32_FILE_ATTRIBUTE_DATA FileData;
  SYSTEMTIME SystemTime;
  GetFileAttributesEx(FileName, GetFileExInfoStandard, &FileData);
  FileTimeToSystemTime(&FileData.ftLastWriteTime, &SystemTime);
  return EncodeDate(SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay);
}[/cpp]




delphi
  1. function GetModifyFileDate(FileName: String): TDate;
  2. var
  3.   FileData:  WIN32_FILE_ATTRIBUTE_DATA;
  4.   SystemTime: TSYSTEMTIME;
  5. begin
  6.   GetFileAttributesEx(PCHAR(FileName), GetFileExInfoStandard, @FileData);
  7.   FileTimeToSystemTime(FileData.ftLastWriteTime, SystemTime);
  8.   Result:= EncodeDate(SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay);
  9. end;




Saludos.
  • 0

#12 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.963 mensajes
  • LocationMadrid - España

Escrito 27 marzo 2011 - 12:05

Y para añadir algo mas, solo y solo si vamos a abrir el archivo, o estamos seguros de que no está en uso, podemos saber la fecha de modificación de esta manera:



delphi
  1. function GetModifyFileDate(FileName: String): TDate;
  2. var
  3.   hFile: integer;
  4. begin
  5.   Result:= 0;
  6.   hFile:= FileOpen(PCHAR(FileName), fmOpenRead);
  7.   if(hFile = -1) then exit;
  8.   Result:= FileDateToDateTime(FileGetDate(hFile));
  9.   FileClose(hFile);
  10. end;



Es un uso de la función de delphi FileGetDate. También se podría usar la API GetFileTime.

Recalco que no es buena idea abrir un archivo para conocer ciertos atributos, pero si ya vamos a abrirlo entonces puede ser un método perfecto.



Saludos.
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.177 mensajes
  • LocationMéxico

Escrito 27 marzo 2011 - 01:40

¿ Y si quisieramos que la función valíde si está abierto un archivo porque no sabemos si está en uso o no ? Digamos para procesos donde no existe la mano de hombre ¿?

Digo, ya que estamos en eso :)

Salud OS

PD, Y digo hombre sin tintes sexistas, me parece más sexista andar diciendo -hombres y mujeres-, -las y los-, -niñas y niños-, etc, etc
  • 0

#14 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.963 mensajes
  • LocationMadrid - España

Escrito 27 marzo 2011 - 03:31

¿ Y si quisieramos que la función valíde si está abierto un archivo porque no sabemos si está en uso o no ? Digamos para procesos donde no existe la mano de hombre ¿?



Bueno, la última función trata de abrir el fichero y si no lo consigue desiste.
Un fichero en uso no compartido no podrá ser abierto de nuevo, es por eso que prefiero el uso de la API GetFileAttributesEx o la implementación de seoane. Ninguna de las dos requiere la apertura del fichero.



PD, Y digo hombre sin tintes sexistas, me parece más sexista andar diciendo -hombres y mujeres-, -las y los-, -niñas y niños-, etc, etc



Efectivamente es mas sexista forzar el idioma para hacer la distinción de género. En español está muy claro el género que debe usarse cuando el sustantivo se usa con carácter general.


Saludos.
  • 0