我在 Windows 环境中使用 Node 。 当我使用 fs.unlinkSync(fileName) 时,它似乎可以工作。 执行 unlinkSync 语句后,如果我执行 fs.existsSync(filename) 它返回 false 表示文件不存在,但是当我转到物理驱动器时,我仍然可以看到该文件。
此时,如果我尝试手动删除文件,则会抛出拒绝访问。 但是,只有当我停止执行 Node 脚本文件时,该文件才会自动从文件系统中删除。
这是预期的行为吗?
最佳答案
如果文件已在您的 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
然后 closeSync
,则在调用 unlinkSync
时会立即删除文件。但是,如果您要删除 closeSync
调用,您会发现只有在 NodeJS 进程完全退出时才会删除该文件。这只是导致此问题发生的方法的一个示例。
如果您使用的是处理文件等的第三方库,则代码可能未正确关闭文件句柄/描述符,您也会遇到此问题(出于相同的原因)。
仅供引用:如果您在基于 Linux 的操作系统上测试此代码,该文件似乎会立即被删除。这是操作系统和文件删除方式之间的行为差异。
详情
Windows 上的 NodeJS 删除文件时,实际上并不是调用 API 直接删除文件。相反,它使用称为 ZwSetInformation
( reference ) 的低级函数。使用该函数,它将指定文件(句柄)的名为 DeleteFile
的字段设置为 TRUE。这样做是为了当该文件的所有文件句柄都关闭时,它将被自动删除。 NodeJS 中的文件以 FILE_SHARE_DELETE 的访问方式打开,以便使用其他功能正确删除。
关于windows - 在 Node.js 中删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20796902/