2013-01-11 10 views
8

Ok, więc mam program, który wyprowadza określone dane do pliku zmiennych rozdzielanych tabulatorami.Sprawdź, czy plik się zmienił za pomocą interfejsu API pliku HTML5

Używałem programu Excel do otwierania i przeglądania zawartości pliku, jednak zauważyłem, że excel nalega na blokowanie każdego otwieranego pliku, aby było niewiarygodnie denerwujące, ponieważ mój program zawiesiłby się, gdybym pozostawił plik otwarty w Excelu ... ale ja Naprawdę bardzo chciałbym, aby dane były starannie aktualizowane po każdym uruchomieniu programu, więc nie muszę przez cały czas zamykać i ponownie otwierać pliku.

Zdecydowałem więc, że najłatwiej będzie użyć Javascript do parsowania pliku i wyświetlenia go w tabeli HTML. Natychmiast zapukałem do siebie. Teraz mój program nie zawiesza się, jeśli zostawiam plik na ekranie, ale nadal nie aktualizuje się ... i za każdym razem muszę otworzyć nowo wygenerowany plik.

Tak, zastanawiałem się, czy istnieje mechanizm, dzięki któremu mój JavaScript może być w jakiś sposób powiadomiony o zmianie pliku przez inny proces? Wiem, że jest to mało prawdopodobne, ale chciałbym uniknąć zwykłego sondowania pliku z oczywistych powodów.

Jestem bardzo zaznajomiony z JS, ale HTML5 i nowe API są dla mnie zupełnie nowe.

Odpowiedz

9

Nie wierzę, że File API ma jakieś wydarzenie dla pliku zmieniającego się, tylko zdarzenia postępu i tym podobne.

Można użyć odpytywania. Zapamiętaj numer lastModifiedDate z File, a następnie po uruchomieniu funkcji odpytywania uzyskaj nową instancję File dla wejścia i zobacz, czy zmieniono lastModifiedDate.

To działa dla mnie w Chrome, na przykład: 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

Wdrożyłem to poprzez znalezienie czasu wśród innych prac. Właśnie testuję to teraz. Wygląda jednak na to, że powinna być świetna. Dzięki! – Luke

+3

Firefox wydaje się buforować plik, za każdym razem wyświetla tę samą datę. –

+0

@ TomášZato: Hmmm, niestety mogę powtórzyć twoje wyniki w Firefoksie. : - | Znaki "cach" (np. "Cache", "caching" itp.) Nie pojawiają się w specyfikacji, więc domyślam się, że wolno robić to, co chce. Może użyć metody "odświeżania" na "Plik" lub niektórych takich. –

2

Podczas gdy T.J. Odpowiedź Crowdera jest poprawna, implementacja Chrome wydaje się przełamywać specyfikację.

Każdy Blob musi mieć wewnętrzny stan migawki, który musi być ustawiony początkowo do stanu bazowego przechowywania, jeżeli taka istnieje bazowy przechowywania i muszą być zachowane poprzez strukturze klonu. Dalsze normatywne definicje stanu migawki można znaleźć dla plików.

Po wybraniu pliku dane wejściowe mają migawkę zawartości w tym miejscu. Lokalne zmiany na dysku nie aktualizują migawki.

+0

Czy to możliwe, że Chrome w systemie Windows łamie specyfikację? System plików Linux może sprawić, że implementacja będzie łatwiejsza niż w systemie Windows ... –

+1

Jest to również obserwowane zachowanie w systemie MacOS. –

Powiązane problemy