在Node.js中删除文件

我在Windows环境中使用节点。 当我使用fs.unlinkSync(fileName),它似乎工作。 执行unlinkSync语句之后,如果我做了一个fs.existsSync(filename),它将返回false,表明该文件不存在,但是当我到物理驱动器时,仍然可以看到该文件。

在这个时候,如果我尝试手动删除文件,它会抛出访问被拒绝。 但是,只有当我停止正在执行的节点脚本文件时,该文件才会自动从文件系统中删除。

这是预期的行为?

Solutions Collecting From Web of "在Node.js中删除文件"

如果文件已经在NodeJS代码中打开并且没有关闭,你将会遇到你正在经历的行为。 它在Windows上的行为如预期。

以此代码为例:

var fs = require('fs'); var filename = "D:\\temp\\temp.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 ,然后在文件上使用openSync ,则在调用unlinkSync时立即删除该文件。 但是,如果您要删除closeSync调用,则只有当NodeJS进程完全退出时,才会删除该文件。 这只是引起这个问题发生的一个例子。

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

仅供参考:如果您在基于Linux的操作系统上测试此代码,则该文件将显示为立即被删除。 这是操作系统之间的行为差​​异以及删除文件的方式。

细节

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