2013-01-11 132 views
8

好吧,所以我有一個程序輸出一些特定的數據到一個選項卡分隔變量文件。檢查文件是否已經改變使用HTML5文件API

我一直在使用Excel來打開和查看文件內容,但是我發現excel堅持要鎖定它打開的每個文件,這是令人難以置信的煩人,因爲如果我將文件在Excel中保留爲打開狀態,程序會崩潰......但是,在每次運行程序後,都會真正喜歡數據的整潔更新,所以我不必一直關閉並重新打開文件。

所以,我決定使用Javascript來解析文件並將其顯示在html表格中是最容易的,而且它是。我立刻把東西撞在一起。現在我的程序不會崩潰,如果我離開文件顯示,但是,它仍然不會更新...我必須每次打開新生成的文件。

所以,我想知道是否有一種機制,通過這種機制,我的Javascript可以通過另一個進程通知某個文件更改?我知道這是不太可能的,但我想避免簡單地輪詢該文件,原因很明顯。

我對JS非常熟悉,但HTML5和新的API對我來說都是新的。

回答

9

我不相信File API有文件更改的任何事件,只是進度事件等。

您可以使用輪詢。記住FilelastModifiedDate,然後當您的輪詢功能觸發時,爲輸入獲取新的File實例,並查看lastModifiedDate是否已更改。

這適用於我在Chrome上,例如: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

我已經實現了這一點,通過尋找其他工作中的時間。我現在只是測試它。看起來它應該是偉大的,但。 謝謝! – Luke

+3

Firefox似乎要緩存文件,它每次都會生成相同的日期。 –

+0

@TomášZato:嗯,可悲的是我可以在Firefox上覆制你的結果。 : - |字符「cach」(例如,「緩存」,「緩存」等)根本沒有出現在規範中,所以我想它可以做它想做的事情。可以使用「文件」或類似的「刷新」方法。 –

2

雖然T.J.克勞德的回答是正確的,Chrome的實施似乎違反了規範。

每個斑點必須有一個內部快照狀態,必須初始設定到下面的存儲的狀態下,如果任何這樣的底層存儲存在,並且必須通過結構化的克隆被保留。可以爲文件找到快照狀態的進一步標準定義。

當選擇一個文件時,輸入內容的快照就是這個點的內容。磁盤上的本地更改不會更新快照。

+0

Windows上的Chrome可能違反規範嗎? Linux文件系統可能會比在Windows上更容易實現... –

+1

這也是macOS上觀察到的行爲。 –

相關問題