2011-05-30 7 views
7

Cuando elige un archivo en Finder y pulsa cmd + i en una Mac, obtiene la hora en que se creó (realmente) el archivo y la hora en que se modificó por última vez.¿Cómo obtengo el tiempo de creación real de un archivo en PHP en una Mac?

Mi pregunta es sencilla: ¿cómo puedo obtener el tiempo real de creación de un archivo Mac ya existente con PHP?

Ahora, después de haber investigado el tema, he leído publicaciones que dicen que es imposible, pero en mi mundo "imposible" solo significa que una cosa lleva un poco más de tiempo en realizarse. Las soluciones y los cortes son bienvenidos.

No quiero consejos relacionados con mtime o ctime, ya que estos solo tienen acceso a la última vez que se actualizó o modificó el archivo.

Probablemente también hablamos de Mac solo aquí, pero las soluciones independientes del sistema operativo también son bienvenidas, si realmente funcionan en todos los sistemas.

+0

POSIX no especifica un atributo de tiempo de creación de archivo – Alnitak

+1

BSD does (st_birthtime), que incluye OSX! :) – lunixbochs

+0

I <3 BSD. Entiendo que esto significa que cualquier solución que se encuentre aquí, posiblemente funcione en otros sistemas BSD. :) – Kebman

Respuesta

7

Esta secuencia de comandos es la mejor que he manejado, que envuelve la herramienta de línea de comandos stat disponible en BSD para obtener el atributo inode de tiempo de nacimiento.

// stat.php 
$filename = 'test'; 

$stat = stat($filename); 
date_default_timezone_set('America/Denver'); 
echo strftime("atime: %H:%M:%S\n", $stat['atime']); 
echo strftime("mtime: %H:%M:%S\n", $stat['mtime']); 
echo strftime("ctime: %H:%M:%S\n", $stat['ctime']); 

if ($handle = popen('stat -f %B ' . escapeshellarg($filename), 'r')) { 
    $btime = trim(fread($handle, 100)); 
    echo strftime("btime: %H:%M:%S\n", $btime); 
    pclose($handle); 
} 

La línea de comandos stat herramienta lee atime, ctime, -mtime exactamente igual de estadísticas de PHP, pero se le ocurre un cuarto parámetro "tiempo de nacimiento i-nodo". La llamada al sistema BSD stat() devuelve st_birthtime cuando esté disponible, pero no he encontrado una forma de exponerlo de manera nativa a PHP.

$ touch test # create a file 
$ stat test 
..."May 30 06:16:22 2011" "May 30 06:16:22 2011" "May 30 06:16:22 2011" "May 30 06:16:11 2011"... 
$ open . 
$ touch test # about one minute later 
$ stat test 
..."May 30 06:17:04 2011" "May 30 06:17:04 2011" "May 30 06:17:04 2011" "May 30 06:16:11 2011"... 

$ php stat.php 
atime: 06:52:48 
mtime: 06:17:04 
ctime: 06:17:04 
btime: 06:16:11 

El siguiente comando devuelve una marca de tiempo Unix de hora de nacimiento única el nodo-i, que es el mejor que he encontrado hasta ahora. Se puede ejecutar con o popen()proc_open()

$ stat -f %B test 
1306757771 
+0

¡Genial! Esto parece prometedor. ¡Gracias! – Kebman

0

La única cercano que puede llegar es la última vez actualizado por la función filemtime.

2

MacOS X tiene una versión extendida de la llamada al sistema stat() que también devuelve la hora de creación del archivo, pero no está habilitada por defecto (incluso en código C nativo) ya que la estructura resultante tiene sus campos en un orden diferente al de la versión estándar POSIX.

En 10,6 esa versión es proporcionada por el símbolo (oculto) _stat$INODE64 en /usr/lib/libc.dylib que está sustituido de forma automática para stat si se define la macro _DARWIN_FEATURE_64_BIT_INODE.

Si puede averiguar cómo acceder a ese símbolo desde la biblioteca dinámica, ¡haga su trabajo!

+0

¡Genial! Sin embargo, el acceso a los símbolos parece difícil ... ¿Es solo cuestión de dejar de comentar una línea o más? Además, me pregunto, ¿es diferente en Mac OS X 10.5? – Kebman

Cuestiones relacionadas