file.createNewFile () crée des fichiers avec le temps de dernière modification avant l'heure de création effective

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

Question

J'utilise JPoller pour détecter les modifications des fichiers dans un répertoire spécifique, mais il est des fichiers manquants parce que ils finissent avec un horodatage plus tôt que leur temps de création réelle. Voici comment je test:

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");
        }
    }
}

Et voici ce que je reçois pour la sortie:

-----------------------------------------
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

Le résultat est une condition de course:

  1. JPoller enregistre le temps du dernier contrôle xyz ... 123
  2. fichier créé à xyz ... 456
  3. Fichier horodatage de dernière modification se lit en fait xyz ... 000
  4. JPoller recherche de nouveaux / fichiers mis à jour avec horodatage supérieur à xyz ... 123
  5. JPoller nouveau fichier ajouté ignore les car ... xyz 000 est inférieure à xyz ... 123
  6. Je tire mes cheveux pendant un certain temps

J'ai essayé de creuser dans le code, mais les deux lastModified() et createNewFile() éventuellement résoudre les appels natifs, donc je suis parti avec peu d'informations.

Pour test.9, je perds 957 millisecondes . Quel genre de précision puis-je attendre? Mes résultats vont varier selon le système d'exploitation ou système de fichiers? solutions de contournement suggérées?

NOTE: Je suis actuellement sous Linux avec un système de fichiers XFS. J'ai écrit un programme rapide dans C et appel de système stat spectacles st_mtime comme truncate(xyz...000/1000).

UPDATE : Je courais le même programme que j'ai ci-dessus sur Windows 7 avec NTFS et Finalité maintenir la précision de la milliseconde complète. lien MSDN @mdma a fourni d'autres notes que FAT est exacte des systèmes de fichiers pour créer avec une résolution de 10 ms, mais pour l'accès est seulement une précision de 2 secondes. Ainsi, c'est vraiment dépendant de l'OS.

Était-ce utile?

La solution

Les systèmes de fichiers ne stockent pas le temps avec précision, et souvent à une résolution milliseconde, par exemple FAT a une 2-deuxième résolution pour le temps de création et NTFS peut retarder la mise à jour la dernière fois d'accès jusqu'à une heure. (détails sur MSDN .) Bien que non dans votre cas, en général, il y a aussi le problème de la synchronisation des horloges si le fichier est créé sur un autre ordinateur.

Il semble que cela pourrait être un problème pour les gens de JPoller, car c'est là la logique de gestion du temps est. Jusqu'à ce qu'il fixe, vous pouvez contourner le problème en réglant manuellement la dernière modification de chaque fichier écrit pour être +4 secondes du temps réel - 4 est une valeur arbitraire qui devrait être supérieure à la résolution du système de fichiers que vous travaillez. Lorsque les fichiers sont écrits dans le système de fichiers, ils seront arrondies vers le bas, mais inférieure à la valeur que vous avez ajouté. Pas assez, mais il fonctionne!

Autres conseils

L'horodatage de la dernière modification est apparemment stocké en quelques secondes, pas en millisecondes. Cela pourrait être une limitation du système de fichiers. Je vous suggère de le comparer contre secondes plutôt que millisecondes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top