15

さて、特定のデータをタブ区切りの変数ファイルに出力するプログラムがあります。

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

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

それで、別のプロセスによるファイルへの変更を何らかの方法で Javascript に通知できるメカニズムがあるかどうか疑問に思っていましたか? これがありそうにないことはわかっていますが、明らかな理由から、単にファイルをポーリングすることは避けたいと思います。

私は JS に精通していますが、HTML5 と新しい API はすべて初めてです。

4

3 に答える 3

11

File APIには、ファイル変更のイベントはなく、進行状況イベントなどがあると思います。

2020年8月の更新:以下の代替手段は機能しなくなり、仕様では、オブジェクトの情報は、選択された時点での基になるファイルの状態を反映する必要があると述べて、特に許可されていません。File仕様から:

ユーザーエージェントは、参照が取得された時点で、ファイルオブジェクトのスナップショット状態をディスク上の基になるストレージの状態に設定するように努める必要があります。参照が取得された後にファイルがディスク上で変更された場合、ファイルのスナップショットの状態は、基盤となるストレージの状態とは異なります。


ポーリングを使用できます。のを覚えておいて、lastModifiedDateポーリングFile関数が起動したらFile、入力の新しいインスタンスを取得して、lastModifiedDateが変更されたかどうかを確認します。

これはChromeで機能します。たとえば、次のようになります。ソース

(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);
  }
})();
<input type='file' id='filename'>
<input type='button' id='btnStart' value='Start'>

于 2013-01-11T18:14:39.190 に答える
4

TJ Crowder の答えは正しいですが、Chrome の実装は仕様に違反しているようです。

各 BLOB には、内部スナップショットの状態が必要です。これは、そのような基になるストレージが存在する場合、最初に基になるストレージの状態に設定する必要があり、構造化されたクローンによって保持する必要があります。ファイルについては、スナップショット状態のさらなる規範的な定義を見つけることができます。

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

于 2017-02-17T12:01:55.980 に答える