Node.JS文件系统重命名不起作用。

7

在Debian Wheezy上,使用fs.rename或fs.renameSync重命名文件无效。

只有将文件从/tmp/移动到其他位置时才会出现此问题。

报告的错误是:EXDEV,不允许跨设备链接。


你可以看到这个。我认为对你有用。 [这里][1] [1]: https://dev59.com/7W455IYBdhLWcg3wD_oB - SaliproPham
3个回答

2
这是我另外一个可行的解决方案:

以下是代码示例:

var fs = require("fs"),
util = require('util');
...
//fs.renameSync(files.upload.path, "/tmp/test.png");

var readStream = fs.createReadStream(files.upload.path)
var writeStream = fs.createWriteStream("/tmp/test.png");

util.pump(readStream, writeStream, function() {
    fs.unlinkSync(files.upload.path);
});

0

Debian Wheezy默认使用tmpfs作为/tmp文件夹。

可以通过修改/etc/default/rcS来关闭此功能。

RAMTMP=yes

必须设置为

RAMTMP=no

3
问题是Node fs.renameSync无法进行跨设备重命名,而不是某台特定机器上的tmp在不同设备上。不要因此关闭RAMTMP。(还有,在当前的Debian Jessie中,RAMTMP不起作用,/ tmp tmpfs是通过systemd配置的。) 使用一些更智能的重命名方法,例如模块__mv__: https://dev59.com/7W455IYBdhLWcg3wD_oB#29287813 - Messa

0
在尝试重命名文件时,我遇到了这个问题,原因是我没有包含文件的目录名和相对路径(来自fileRenameScript.js文件目录)到我想要重命名的文件中。
for(let i=0; i<readdirFileNames.length; i++){
     fs.rename(__dirname+”/sample/strings/“+ readdirFileNames[i], 
     __dirname+”/sample/strings/“+  readdirFileNames[i].split(“trashToRemove”).join(“”), 
     ()=>{
        console.log(“File renamed”)
     })
}

那是让我成功重命名的代码。如果其他人遇到这个问题,请参考这段代码,了解文件名重命名所需的详细级别。
如果文件不存在,或者没有提供任何错误信息来解释为什么文件名没有改变,那么文件系统重命名操作将继续进行,就好像它是成功的一样。当我最终成功使更改生效时,代码运行方式和输出结果都没有任何变化。
这种行为是在我的node v20.2.0版本中观察到的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接