file.createNewFile () crea archivos con fecha de última modificación antes de tiempo de creación real

StackOverflow https://stackoverflow.com/questions/2717936

Pregunta

Estoy usando JPoller para detectar cambios en los archivos en un directorio específico, pero le faltan archivos porque terminan con una marca de tiempo antes de su tiempo de creación real. Así es como yo de prueba:

public static void main(String [] files)
{
    for (String file : files)
    {
        File f = new File(file);
        if (f.exists())
        {
            System.err.println(file + " exists");
            continue;
        }

        try
        {
            // find out the current time, I would hope to assume that the last-modified
            // time on the file will definitely be later than this
            System.out.println("-----------------------------------------");
            long time = System.currentTimeMillis();

            // create the file
            System.out.println("Creating " + file + " at " + time);
            f.createNewFile();

            // let's see what the timestamp actually is (I've only seen it <time)
            System.out.println(file + " was last modified at: " + f.lastModified());

            // well, ok, what if I explicitly set it to time?
            f.setLastModified(time);
            System.out.println("Updated modified time on " + file + " to " + time + " with actual " + f.lastModified());
        }
        catch (IOException e)
        {
            System.err.println("Unable to create file");
        }
    }
}

Y esto es lo que me pasa por la salida:

-----------------------------------------
Creating test.7 at 1272324597956
test.7 was last modified at: 1272324597000
Updated modified time on test.7 to 1272324597956 with actual 1272324597000
-----------------------------------------
Creating test.8 at 1272324597957
test.8 was last modified at: 1272324597000
Updated modified time on test.8 to 1272324597957 with actual 1272324597000
-----------------------------------------
Creating test.9 at 1272324597957
test.9 was last modified at: 1272324597000
Updated modified time on test.9 to 1272324597957 with actual 1272324597000

El resultado es una condición de carrera:

  1. JPoller registra la hora del último control como XYZ ... 123
  2. Archivo creado el xyz ... 456
  3. Archivo de marca de tiempo modificada por última vez realmente lee-xyz ... 000
  4. JPoller busca los archivos nuevos / actualizados con mayor marca de tiempo de XYZ ... 123
  5. JPoller ignora archivo recién añadida a causa XYZ ... 000 es inferior a 123 XYZ ...
  6. Saco mi pelo hacia fuera por un tiempo

Me trató de cavar en el código pero ambos lastModified() y createNewFile() eventualmente se resuelva a las llamadas nativas por lo que me queda poca información.

Para test.9, I perder 957 milisegundos . ¿Qué clase de exactitud se puede esperar? Son mis resultados van a variar según el sistema operativo o el sistema de archivos? soluciones sugeridas?

NOTA: Actualmente estoy corriendo Linux con un sistema de ficheros XFS. Escribí un programa rápido en C y muestra la href="http://linux.die.net/man/2/stat" rel="nofollow noreferrer"> de estadísticas de llamadas al sistema st_mtime como truncate(xyz...000/1000).

Actualizar : me encontré con el mismo programa que tengo más arriba en Windows 7 con NTFS y ¿Tiene mantener una precisión de milisegundos completa. El MSDN enlace @mdma proporcionó más notas que la grasa es preciso para sistemas de ficheros crea con una resolución de 10 ms, pero el acceso es sólo exacta a 2 segundos. Por lo tanto, esto es realmente depende del sistema operativo.

¿Fue útil?

Solución

Los sistemas de ficheros no almacenan el tiempo con precisión, y con frecuencia no a una resolución de milisegundos, por ejemplo, La grasa tiene un 2-segunda resolución de tiempo de creación, y NTFS puede retrasar la actualización de la última vez que el acceso de hasta una hora. (detalles en la MSDN .) Aunque no se en su caso, en general, existe también el problema de la sincronización de los relojes si se crea el archivo en otro equipo.

Parece que esto podría ser un problema para las personas JPoller, ya que es donde la lógica de manejo de tiempo es. Hasta que se fija, se podría solucionar este ajustando manualmente la fecha de última modificación de cada archivo escrito para ser +4 segundos de la hora real - 4 es un valor arbitrario que debe ser mayor que la resolución del sistema de archivos que está trabajando. Cuando los archivos se escriben en el sistema de archivos, que se redondean hacia abajo, pero en menor medida que el valor que haya agregado. No es bonita, pero funcionará!

Otros consejos

La última modificación de marca de tiempo es aparentemente almacena en segundos, no en milisegundos. Eso podría ser una limitación del sistema de archivos. Yo sugeriría que compararlo contra el segundo lugar de milisegundos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top