2012-09-19 11 views
5

¿Ofrece Windows algo como el campo st_ctime de POSIX stat, que da la fecha y hora del último cambio de metadatos?Windows y ctime/st_ctime

Antecedentes: tengo algunos archivos de datos que me gustaría verificar si se han modificado desde una fecha y hora determinada. Comprobar la marca de tiempo modificada (mtime) es fácil y se ocupa de las modificaciones "normales", pero si el usuario copia sobre versiones anteriores de los archivos de datos, la marca de tiempo modificada mostrará que son más antiguos. En un sistema POSIX, copiar sobre un archivo anterior daría como resultado que ctime sea más reciente, incluso si mtime es más antiguo.

Respuesta

2

Por lo que puedo decir, Windows proporciona proporciona un campo "último cambio", pero no he encontrado ninguna API de Win32 para acceder a él, por lo que debe utilizar la API nativa.

Específicamente: (no he probado este hecho.)

  • llamada NtOpenFile para conseguir una manija.
  • Llame NtQueryInformationFile con un parámetro FileInformationClass de FileNetworkOpenInformation para obtener una estructura FILE_NETWORK_OPEN_INFORMATION.
  • El miembro CreationTime de la estructura FILE_NETWORK_OPEN_INFORMATION es equivalente a POSIX ctime.

El uso de la API nativa no es exactamente sencillo. This question and answer describe cómo hacerlo.

Cygwin se aprovecha de esto para proporcionar semántica POSIX en Windows, como se describe on their mailing list. Estoy obteniendo mi información del their implementation.

Y aunque solo está relacionado tangencialmente, this article tiene una buena descripción de la marca de tiempo "creada" que presenta Windows (y desafortunadamente se refiere como ctime). La marca de tiempo creada puede ser más nueva que la marca de tiempo modificada si se copia un archivo en una nueva ubicación (ya que se creó cuando se creó, mientras que la modificación se refiere a la última modificación), pero de lo contrario no se actualiza cuando los metadatos son cambiados

+1

Gracias, sí, eso es lo que @piscisaureus terminó haciendo en libuv. ctime ahora se implementa con la semántica de Unix (también conocida como "correctamente") en libuv: https://github.com/joyent/libuv/commit/20a8e58adb2a3fc2e92ceb6e1ceb6f05d7e0d439 Aunque esta respuesta llegó después de que ya la habíamos encontrado, se le otorgó la recompensa porque has ayudado a los buscadores futuros a encontrar la respuesta correcta :) – isaacs