2013-01-11 15 views
8

これで、特定のデータをタブで区切られた可変ファイルに出力するプログラムがあります。HTML5ファイルAPIを使用してファイルが変更されていないか確認してください。

私はファイルの内容を開いて表示するためにExcelを使用していましたが、ファイルをExcelで開いたままにしておくと、プログラムがクラッシュするため、開くすべてのファイルをロックするというExcelの主張が見つかりました...プログラムを実行するたびにデータがきちんと更新されることが本当に好きなので、いつでもファイルを閉じて再オープンする必要はありません。

私は、ファイルを解析してhtmlテーブルに表示するにはJavascriptを使用するのが最も簡単だと決めました。私はすぐに何かを一緒にノックした。ファイルを表示したままにすると、私のプログラムはクラッシュしませんが、それでもまだ更新されません...そして、毎回新しく生成されたファイルを開く必要があります。

私の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に複製することができます。 : - | 「キャッシュ」(「キャッシュ」、「キャッシング」など)の文字は仕様には表示されないため、必要なことをすることは許可されています。 'File'などで" refresh "メソッドを使うことができました。 –

2

While T.J. Crowderの答えは正しいですが、Chromeの実装は仕様を破っているようです。

各Blobには内部スナップショット状態が必要です。このスナップショット状態は、基になるストレージが存在する場合は最初は基底ストレージの状態に設定する必要があり、構造化クローンで保持する必要があります。スナップショット状態のさらに標準的な定義は、ファイルで見つけることができます。

ファイルが選択されると、入力はその時点での内容のスナップショットを持ちます。ディスク上のローカル変更はスナップショットを更新しません。

+0

Windows上のChromeだけで仕様が破損する可能性はありますか? Linuxのファイルシステムでは、Windowsよりも簡単に実装することができます。 –

+1

これはmacOSでも観察されている動作です。 –

関連する問題