2013-01-11 11 views
8

Okay, ich habe also ein Programm, das einige spezifische Daten in eine Tab-getrennte Variable-Datei ausgibt.Überprüfen Sie, ob sich die Datei mit der HTML5-Datei-API geändert hat.

Ich hatte Excel verwendet, um den Inhalt der Datei zu öffnen und anzuzeigen, aber ich fand Excel Beharren auf jede Datei zu sperren unglaublich nervend, wie mein Programm würde abstürzen, wenn ich die Datei in Excel geöffnet ... aber ich Ich würde es wirklich gerne sehen, wenn die Daten nach jedem Lauf des Programms ordentlich aktualisiert werden, also muss ich die Datei nicht immer schließen und neu öffnen.

Also entschied ich, dass es am einfachsten wäre, Javascript zu verwenden, um die Datei zu analysieren und sie in einer HTML-Tabelle anzuzeigen, und das war es auch. Ich habe in kurzer Zeit etwas zusammengeschlagen. Jetzt stürzt mein Programm nicht ab, wenn ich die Datei auf dem Display belasse, es wird jedoch immer noch nicht aktualisiert ... und ich muss die neu erzeugte Datei jedes Mal öffnen.

Also fragte ich mich, ob es einen Mechanismus gab, mit dem mein Javascript irgendwie von einer Änderung der Datei durch einen anderen Prozess benachrichtigt werden konnte? Ich weiß, das ist unwahrscheinlich, aber ich möchte vermeiden, die Datei aus offensichtlichen Gründen einfach abzurufen.

Ich bin sehr vertraut mit JS, aber HTML5 und die neuen APIs sind alle neu für mich.

Antwort

9

Ich glaube nicht, die File API hat ein Ereignis für die Datei ändern, nur Fortschritte Ereignisse und dergleichen.

Sie könnten Abfragen verwenden. Denken Sie daran, die lastModifiedDate der File, und dann, wenn Ihre Abruffunktion ausgelöst wird, erhalten Sie eine neue File Instanz für die Eingabe und sehen, ob die lastModifiedDate hat sich geändert.

Dies funktioniert für mich auf Chrome, zum Beispiel: Live Copy | Source

<!DOCTYPE HTML> 
<html> 
<head> 
<meta http-equiv="Content-type" content="text/html;charset=UTF-8"> 
<title>Watch for a file change</title> 
<style type='text/css'> 
body { 
    font-family: sans-serif; 
} 
</style> 
</head> 
<body> 
<input type='file' id='filename'> 
<input type='button' id='btnStart' value='Start'> 
<script type='text/javascript'> 
(function() { 
    var input; 
    var lastMod; 

    document.getElementById('btnStart').onclick = function() { 
     startWatching(); 
    }; 
    function startWatching() { 
     var file; 

     if (typeof window.FileReader !== 'function') { 
      display("The file API isn't supported on this browser yet."); 
      return; 
     } 

     input = document.getElementById('filename'); 
     if (!input) { 
      display("Um, couldn't find the filename element."); 
     } 
     else if (!input.files) { 
      display("This browser doesn't seem to support the `files` property of file inputs."); 
     } 
     else if (!input.files[0]) { 
      display("Please select a file before clicking 'Show Size'"); 
     } 
     else { 
      file = input.files[0]; 
      lastMod = file.lastModifiedDate; 
      display("Last modified date: " + lastMod); 
      display("Change the file"); 
      setInterval(tick, 250); 
     } 
    } 

    function tick() { 
     var file = input.files && input.files[0]; 
     if (file && lastMod && file.lastModifiedDate.getTime() !== lastMod.getTime()) { 
      lastMod = file.lastModifiedDate; 
      display("File changed: " + lastMod); 
     } 
    } 

    function display(msg) { 
     var p = document.createElement('p'); 
     p.innerHTML = msg; 
     document.body.appendChild(p); 
    } 
})(); 
</script> 
</body> 
</html> 
+0

Ich habe dies implementiert, indem ich Zeit neben anderen Arbeiten gefunden habe. Ich teste es gerade jetzt aus. Sieht so aus, als sollte es aber großartig sein. Danke! – Luke

+3

Firefox scheint die Datei zu cachen, es erzeugt jedes Mal das gleiche Datum. –

+0

@ TomášZato: Hmmm, leider kann ich Ihre Ergebnisse in Firefox replizieren. : - | Die Zeichen "cach" (z. B. "cache", "caching" usw.) erscheinen in der Spezifikation überhaupt nicht, daher denke ich, dass es erlaubt ist, zu tun, was es will. Könnte eine "Refresh" -Methode für 'File' oder ähnliches verwenden. –

2

Während T.J. Crowders Antwort ist korrekt, die Implementierung von Chrome scheint die Spezifikation zu durchbrechen.

Jeder Blob muss einen internen Snapshot-Status haben, der anfänglich auf den Zustand des zugrunde liegenden Speichers gesetzt werden muss, wenn ein solcher zugrunde liegender Speicher vorhanden ist, und muss durch strukturierten Klon erhalten bleiben. Eine weitere normative Definition des Snapshot-Status kann für Dateien gefunden werden.

Wenn eine Datei ausgewählt ist, hat die Eingabe eine Momentaufnahme des Inhalts an diesem Punkt. Lokale Änderungen auf dem Datenträger aktualisieren den Snapshot nicht.

+0

Ist es möglich, dass nur Chrome unter Windows die Spezifikation bricht? Linux-Dateisystem könnte die Implementierung einfacher als unter Windows machen ... –

+1

Dies ist das beobachtete Verhalten auf MacOS. –

Verwandte Themen