Domanda

JPoller per rilevare le modifiche ai file in una directory specifica, ma che manca file perché finiscono con un timestamp prima di quanto il loro tempo effettiva creazione. Ecco come ho 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");
        }
    }
}

Ed ecco ciò che ho per l'uscita:

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

Il risultato è una condizione di competizione:

  1. JPoller registra momento del controllo, come xyz ... 123
  2. File creato il xyz ... 456
  3. File timestamp dell'ultima modifica in realtà legge xyz ... 000
  4. JPoller cerca i file nuovi / aggiornati con timestamp maggiore di xyz ... 123
  5. JPoller ignora recente del file aggiunto perché xyz ... 000 è inferiore a xyz ... 123
  6. I tirare fuori i miei capelli per un po '

Ho provato scavare nel codice ma entrambi lastModified() e createNewFile() alla fine decidere di chiamate native quindi sono lasciato con poche informazioni.

Per test.9, perdo 957 millisecondi . Che tipo di accuratezza posso aspettarmi? Sono i miei risultati andando a variare a seconda del sistema operativo o file system? soluzioni alternative suggerite?

Nota: Sono attualmente in esecuzione Linux con un filesystem XFS. Ho scritto un programma veloce in C e spettacoli la stat chiamata di sistema st_mtime come truncate(xyz...000/1000).

Aggiorna : Ho eseguito lo stesso programma che ho in precedenza su Windows 7 con NTFS e Il mantenere la massima precisione millisecondo. Il MSDN link @mdma fornito ulteriori note che il grasso filesystem è accurata per creare con risoluzione di 10 ms, ma per l'accesso indica una a 2 secondi. Quindi, questo è veramente dipende dal sistema operativo.

È stato utile?

Soluzione

I file system non memorizzare il tempo con precisione, e spesso non alla risoluzione di millisecondo, per esempio FAT ha un 2-seconda risoluzione per ora di creazione e NTFS può ritardare aggiornare l'ultima volta accesso fino ad un'ora. (dettagli su MSDN .) Anche se non nel tuo caso, in generale, v'è anche il problema di sincronizzazione degli orologi se il file viene creato su un altro computer.

Sembra che questo potrebbe essere un problema per la gente JPoller, dal momento che questo è dove la logica tempo di trattamento è. Fino a quando è fissato, si potrebbe risolvere questo impostando manualmente la data dell'ultima modifica di ogni file scritto per essere +4 secondi dal tempo effettivo - 4 è un valore arbitrario che dovrebbe essere superiore alla risoluzione del filesystem si sta lavorando. Quando i file vengono scritti nel file system, saranno arrotondati per difetto, ma inferiore al valore che avete aggiunto. Non abbastanza, ma funzionerà!

Altri suggerimenti

L'ultima modifica timestamp è apparentemente memorizzato in secondi, non in millisecondi. Che potrebbe essere una limitazione del file system. Io suggerirei di confrontarlo secondi invece di millisecondi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top