Javascript 检查本地文件是否已更改

Javascript 检查本地文件是否已更改,javascript,filereader,fileapi,Javascript,Filereader,Fileapi,我有一个web应用程序,用户可以使用html5选择一个本地文件作为输入。有什么方法可以检查文件是否已更改,这在现代浏览器中有效吗 过去,在某些浏览器中,可以通过轮询file对象并比较file.lastModifiedDate(已弃用)或file.lastModified属性来实现这一点,如本QA中所述:。但是,该规范规定,lastModifiedDate和其他文件数据应该是该文件的快照,就像用户第一次选择它时的样子,因此这不应该起作用(而且似乎大多数浏览器的最新版本现在确实遵循了该规范,这使得这

我有一个web应用程序,用户可以使用html5选择一个本地文件作为输入。有什么方法可以检查文件是否已更改,这在现代浏览器中有效吗

过去,在某些浏览器中,可以通过轮询file对象并比较
file.lastModifiedDate
(已弃用)或
file.lastModified
属性来实现这一点,如本QA中所述:。但是,该规范规定,
lastModifiedDate
和其他文件数据应该是该文件的快照,就像用户第一次选择它时的样子,因此这不应该起作用(而且似乎大多数浏览器的最新版本现在确实遵循了该规范,这使得这种攻击不可用)

我希望能够通过读取文件来检查更改。这种方法是可行的,但一旦文件在磁盘上被更改,Chrome和Firefox就会抛出一个错误,称为
DomeException:无法读取请求的文件,这通常是由于获取文件引用后出现的权限问题有办法解决这个问题吗

这就是我所尝试的:

let oldText

setInterval(function () {
  const fileObj = document.getElementById('myFileInput').files[0]
  const reader = new FileReader()
  reader.onload = evt => {
      const text = evt.target.result
      if (text !== oldText) {
        console.log("The file has changed!")
        oldText = text
      }
    }
    reader.readAsText(fileObj)
}, 1000)
…或更简单:

const fileObj = document.getElementById('myFileInput').files[0]
const reader = new FileReader()
reader.readAsText(fileObj)  // works
// now lets edit the file and try again
reader.readAsText(fileObj)  // fails

reader.readAsText()
按预期工作,直到文件发生更改时抛出上述错误。我猜这是某种安全措施,尽管我不完全理解它试图保护用户免受什么影响。我能做些什么呢?

如果在浏览器中实现API,这将再次成为可能。它将出现在谷歌Chrome 85中,计划于2020年10月发布

与FileReader API不同,它需要显式的用户交互,因此您可以执行以下操作:

myFileInput.addEventListener('change', async (e) => {
  const fh = await window.chooseFileSystemEntries()
  // fh is now a FileSystemFileHandle object
  // Use fh.getFile() to get a File object
})

这是一项安全措施。您无能为力。规范中涉及在选择后文件更改时禁止读取的部分是.Chrome,是的,这可能意味着Edge(>v44),但它目前看起来不太适合,也不适合Safari-|