Javascript HTML文件输入-选择后锁定文件

Javascript HTML文件输入-选择后锁定文件,javascript,html,file-locking,Javascript,Html,File Locking,在被选择后,浏览器是否有办法“锁定”文件?现在我可以选择一个文件,用JavaScript对其启动一些操作,同时我可以从磁盘上删除它,这会导致JavaScript代码中出现错误 编辑目标是确保在我使用JavaScript处理文件时不能删除该文件。不,没有办法。简单地说,因为JS是一种客户端语言,即使是服务器端,这也是不可能的,因为您无法与计算机用户交互。要做到这一点,你需要你的桌面应用程序,以文件为例,复制并锁定它 如果要实现这一点,必须在浏览器中实现 编辑添加: 如果您想一想为什么浏览器中还没有

在被
选择后,浏览器是否有办法“锁定”文件?现在我可以选择一个文件,用JavaScript对其启动一些操作,同时我可以从磁盘上删除它,这会导致JavaScript代码中出现错误


编辑目标是确保在我使用JavaScript处理文件时不能删除该文件。

不,没有办法。简单地说,因为JS是一种客户端语言,即使是服务器端,这也是不可能的,因为您无法与计算机用户交互。要做到这一点,你需要你的桌面应用程序,以文件为例,复制并锁定它

如果要实现这一点,必须在浏览器中实现

编辑添加:


如果您想一想为什么浏览器中还没有实现这一点,可能是因为如果您在上传文件时脱机会发生什么?保持锁定?

:您可以在内存中创建副本,并使用此副本而不是用户磁盘上的文件。
您必须首先读取其内容,然后从中创建新文件/Blob:

let theFile=null;
inp.onchange=异步函数(e){
theFile=wait saveBlob(inp.files[0]);
btn.disabled=false;
inp.disabled=true;
}
btn.onclick=e=>{
console.log(文件);
let reader=new FileReader();
//证明它真的还在那里
reader.onload=e=>console.log(新的Uint8Array(reader.result));
reader.onerror=e=>console.log(e);
reader.readAsArrayBuffer(文件切片(0,4));
}
函数saveBlob(blob){
let reader=new FileReader();
返回新承诺((res,rej)=>{
reader.onload=e=>{
如果(文件的blob实例){
//尝试将其保存为文件,但请注意,某些实现仍然存在bug
res(新文件([reader.result],blob.name,{type:blob.type}));
}否则{
res(新Blob([reader.result],{type:Blob.type}));
}
};
reader.onerror=rej;//已删除???
reader.readAsArrayBuffer(blob);
});
}


我确实从磁盘上删除了它
,也许问题太模糊了。我的目标是确保文件不能被删除。谢谢你这么做。@250是为了什么?通过将其保留在内存中,文件将不会被删除,并且只要会话处于活动状态,您就可以保留该文件(要将其保留超过文档寿命,您可以为复制的Blob创建blobURI),甚至可以在IndexedDB中保留更长的时间。如果您的目标确实是更改用户磁盘上的权限,那么显然您不能。因此,用户无法删除我正在处理的文件。就像你正在用7zip压缩你电脑上的一个文件,你试图重命名/删除它-你不能。我不想更改文件权限。只要确保用户在我完成之前不能删除该文件。正如我在问题中所说的——我不想要,也无法将其存储在内存中,这是错误的,甚至无法处理大于可用内存的文件。@andy250“正如我在问题中所说的……”你在哪里说的?是的,你可以把它存储在内存中,对于大文件,你可以像我告诉你的那样把它们存储在indexedDB中。这将在磁盘上创建仅对浏览器可用的部分副本。您所说的锁定行为是操作系统中的一种,它只允许单个进程同时读取文件。只是因为7-zip还没有发布活动阅读,所以你不能修改它。对不起,我想我提到过它。我明白你对IndexedDB的观点,但在我看来,复制一个20GB的磁盘只是为了“保留它”是一种过分的做法。IndexedDB大小也有限制吗?底线是我想锁定文件,而不是篡改内存或复制它。如果浏览器无法实现这一点,那就这样吧。