windows - 在 Node.js 中删除文件

标签 windows node.js unlink

我在 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/

相关文章:

PHP 取消链接在 codeigniter 中不起作用

c# - 适用于 Windows 应用程序 (C++/C#) 的屏幕键盘,具有触摸屏功能

c++ - 具有绝对日期的夏令时更改

node.js - 将多个 MJML 文件渲染为一个 MJML 文件/字符串

Node.js 每三次刷新就无法获取静态文件

terminal - macOS 10.15 终端 - 取消链接获取 "Operation not permitted"

java - 在 Windows 计算机上使用 Java Swing SystemLookAndFeel 会导致带有 JTextPanes 的 CachedPainter 中出现内存泄漏

windows - Windows XP/fiber.node 上的 Meteor 失败

javascript - 如何使用 JavaScript 正则表达式捕获 CSS 多行注释 block

php - 将文件添加到存档后删除文件会阻止创建存档