好的,我有一个程序,它输出一些特定的数据到一个选项卡分隔的变量文件中。
我一直在使用Excel打开和查看文件内容,但是我发现Excel坚持锁定它打开的每一个文件是令人难以置信的恼人的,因为如果我把文件打开在Excel中,我的程序就会崩溃。但是,我真的希望在每次运行程序之后,数据都能整洁地更新,所以我不需要一直关闭和重新打开文件。
因此,我决定使用Javascript解析文件并将其显示在html表中是最简单的,而且它是。我很快就把一些东西拼凑起来了。现在我的程序不会崩溃,如果我把文件保存在显示中,但是它仍然没有更新.每次我都要打开新生成的文件。
所以,我想知道是否有一种机制可以让我的Javascript通过另一个进程得到文件更改的通知?我知道这是不可能的,但我想避免因为明显的原因而简单地轮询文件。
我对JS非常熟悉,但是HTML5和新的API对我来说都是新的。
发布于 2020-05-29 20:20:07
对于这个问题有两种解决方案,而<input type="file">不是其中之一。根据规范,它创建文件的“快照”。
本机文件系统
这个api接口是实验性的,需要在闪烁(也就是铬浏览器)中启用标志。其思想是您获得一个文件句柄,当您需要该文件时,您可以调用异步"getFile“函数来检索实际文件。
这个功能是一个“电源功能”,要求你的网站是安全的,它不能在沙箱的iframes中工作。
因此,如果不进行测试,这里有一些“黑暗中的代码”:
// 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)
}从拖放中获取入口
与本机文件系统类似,您也可以检索文件句柄并执行相同的操作,但是这个特性在今天的所有浏览器中都有效。但是这个代码片段不能在堆栈溢出中工作,因为它使用了一些沙箱使其不兼容,所以下面是一个小提琴,没有多少注释
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使用。
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
}
}
}
})发布于 2017-02-17 12:01:55
虽然T.J.Crowder的回答是正确的,但Chrome的实现似乎违反了规范。
每个Blob必须具有一个内部快照状态,如果存在这样的底层存储,则必须首先将其设置为基础存储的状态,并且必须通过结构化克隆来保存。可以为文件找到快照状态的进一步规范定义。
当选择一个文件时,输入在该位置有内容的快照。磁盘上的本地更改不更新快照。
https://stackoverflow.com/questions/14284124
复制相似问题