加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 删除Node.js中的文件

发布时间:2020-12-14 04:17:54 所属栏目:Windows 来源:网络整理
导读:我在 Windows环境中使用节点. 当我使用fs.unlinkSync(fileName)时,它似乎工作. 执行unlinkSync语句后,如果我执行fs.existsSync(filename),则返回false表示文件不存在,但是当我转到物理驱动器时,我仍然可以看到该文件. 此时如果我尝试手动删除文件,则会抛出拒
我在 Windows环境中使用节点.
当我使用fs.unlinkSync(fileName)时,它似乎工作.
执行unlinkSync语句后,如果我执行fs.existsSync(filename),则返回false表示文件不存在,但是当我转到物理驱动器时,我仍然可以看到该文件.

此时如果我尝试手动删除文件,则会抛出拒绝访问权限.
但是,仅当我停止执行节点脚本文件时,才会自动从文件系统中删除该文件.

这是预期的行为吗?

如果文件已在NodeJS代码中打开而未关闭,您将遇到您遇到的行为.它在Windows上表现得如预期的那样.

以此代码为例:

var fs = require('fs');

var filename = "D:temptemp.zip";
var tempFile = fs.openSync(filename,'r');
// try commenting out the following line to see the different behavior
fs.closeSync(tempFile);

fs.unlinkSync(filename);

如果代码在文件上使用openSync然后使用closeSync,则在调用unlinkSync时会立即删除该文件.但是,如果您要删除closeSync调用,则只有在NodeJS进程干净地退出时才会发现该文件已被删除.这只是导致此问题发生的一种方法的一个示例.

如果您正在使用正在处理文件等的第三方库,则代码可能无法正确关闭文件句柄/描述符,您也会遇到此问题(出于同样的原因).

仅供参考:如果您在基于Linux的操作系统上测试此代码,该文件似乎会立即被删除.这是操作系统与文件删除方式之间的行为差??异.

细节

当Windows上的NodeJS删除文件时,它实际上没有调用API来直接删除文件.相反,它使用一个名为ZwSetInformation(reference)的低级函数.使用该函数,它为指定的文件(句柄)设置一个名为DeleteFile的字段为TRUE.这是使用的,以便当该文件的所有文件句柄都关闭时,它将被自动删除.使用FILE_SHARE_DELETE的访问模式打开NodeJS中的文件,以便可以使用其他功能正确删除它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读