首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用HTML5文件API检查文件是否已更改

使用HTML5文件API检查文件是否已更改
EN

Stack Overflow用户
提问于 2013-01-11 18:09:40
回答 2查看 18.4K关注 0票数 15

好的,我有一个程序,它输出一些特定的数据到一个选项卡分隔的变量文件中。

我一直在使用Excel打开和查看文件内容,但是我发现Excel坚持锁定它打开的每一个文件是令人难以置信的恼人的,因为如果我把文件打开在Excel中,我的程序就会崩溃。但是,我真的希望在每次运行程序之后,数据都能整洁地更新,所以我不需要一直关闭和重新打开文件。

因此,我决定使用Javascript解析文件并将其显示在html表中是最简单的,而且它是。我很快就把一些东西拼凑起来了。现在我的程序不会崩溃,如果我把文件保存在显示中,但是它仍然没有更新.每次我都要打开新生成的文件。

所以,我想知道是否有一种机制可以让我的Javascript通过另一个进程得到文件更改的通知?我知道这是不可能的,但我想避免因为明显的原因而简单地轮询文件。

我对JS非常熟悉,但是HTML5和新的API对我来说都是新的。

EN

回答 2

Stack Overflow用户

发布于 2020-05-29 20:20:07

对于这个问题有两种解决方案,而<input type="file">不是其中之一。根据规范,它创建文件的“快照”。

本机文件系统

这个api接口是实验性的,需要在闪烁(也就是铬浏览器)中启用标志。其思想是您获得一个文件句柄,当您需要该文件时,您可以调用异步"getFile“函数来检索实际文件。

这个功能是一个“电源功能”,要求你的网站是安全的,它不能在沙箱的iframes中工作。

因此,如果不进行测试,这里有一些“黑暗中的代码”:

代码语言:javascript
运行
复制
// triggerd on click
async function pickFile () {
  const handle = showOpenFilePicker()
  let lastModificationTime = 0
  
  async function compare () {
    const file = await handle.getFile()
    if (file.lastModified > lastModificationTime) {
      lastModificationTime = +file.lastModified
      console.log(await file.text())
    }
  }
  
  setInterval(compare, 1000)
}

从拖放中获取入口

与本机文件系统类似,您也可以检索文件句柄并执行相同的操作,但是这个特性在今天的所有浏览器中都有效。但是这个代码片段不能在堆栈溢出中工作,因为它使用了一些沙箱使其不兼容,所以下面是一个小提琴,没有多少注释

代码语言:javascript
运行
复制
function drop(event) {
  event.stopPropagation();
  event.preventDefault();
    
  // get the file as an fileEntry (aka file handle)
  const fileEntry = event.dataTransfer.items[0].webkitGetAsEntry()
  let lastModificationTime = 0
  
  async function read (file) {
    // use the new async read method on blobs.
    console.log(await file.text())
  }
  
  function compare (meta) {
    if (meta.modificationTime > lastModificationTime) {
      lastModificationTime = meta.modificationTime
      fileEntry.file(read)
    }
  }
  
  setInterval(fileEntry.getMetadata.bind(fileEntry, compare), 1000)
}

编辑:现在还有一种方法可以将拖放文件作为一个更好的FileSystemFileHandle使用。

代码语言:javascript
运行
复制
elem.addEventListener('dragover', evt => {
  // Prevent navigation.
  evt.preventDefault()
})
elem.addEventListener('drop', async evt => {
  // Prevent navigation.
  evt.preventDefault()

  // Process all of the items.
  for (const item of evt.dataTransfer.items) {
    // kind will be 'file' for file/directory entries.
    if (item.kind === 'file') {
      const entry = await item.getAsFileSystemHandle();
      if (entry.kind === 'file') {
        // use same solution as the first Native File System solution
      }
    }
  }
})
票数 5
EN

Stack Overflow用户

发布于 2017-02-17 12:01:55

虽然T.J.Crowder的回答是正确的,但Chrome的实现似乎违反了规范。

每个Blob必须具有一个内部快照状态,如果存在这样的底层存储,则必须首先将其设置为基础存储的状态,并且必须通过结构化克隆来保存。可以为文件找到快照状态的进一步规范定义。

当选择一个文件时,输入在该位置有内容的快照。磁盘上的本地更改不更新快照。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14284124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档