NodeJS “EXDEV:不允许跨设备链接”错误意味着什么?

50pmv0ei  于 2023-02-18  发布在  Node.js
关注(0)|答案(5)|浏览(247)

这个错误实际上意味着什么?什么是“跨设备链接”?
this libuv page上提到了这个问题,但是除了“不允许跨设备链接”之外,它没有给予任何细节。

rdrgkggo

rdrgkggo1#

这听起来像是您试图跨“设备”(分区)边界重命名文件。
假设/tmp/是不同的分区,这意味着不允许这样做:

fs.rename('/tmp/myfile.txt', '/myfile.txt', ...)

(the显然,这同样适用于fs.renameSync()
如果你想这样做,你需要先将文件复制到新的位置,然后删除旧的文件,有一些模块,比如mv,可以帮助你。

fumotvh3

fumotvh32#

它用于Linux上的EXDEV:
请参见man rename手册页:

EXDEV oldpath和newpath不在相同的挂载文件系统上。(Linux允许在多个点挂载文件系统,但rename()不能跨不同的挂载点工作,即使在两个挂载点上挂载了相同的文件系统。
Windows上存在ERROR_NOT_SAME_DEVICE时也会出现此错误,请参阅:

  • https://github.com/libuv/libuv/blob/v1.x/src/win/error.c#L166

有关详细信息,请参阅:

winerror.h 0x80070011 #define ERROR_NOT_SAME_DEVICE系统无法将文件移动到其他磁盘驱动器。

uelo1irk

uelo1irk3#

我猜你是试图从/temp文件夹复制一个文件,因为形式。我解决了它复制,而不是重命名

fs.copyFile(oldpath, newpath, function (err) {
            if (err) throw err;
            res.write('File uploaded and moved!');
            res.end();
        });
ybzsozfc

ybzsozfc4#

只是对于那些使用Linux的人来说,当你的旧路径/tmp和新路径在不同的分区或磁盘上时,就会发生这种情况。

ve7v8dk2

ve7v8dk25#

在本例中,我将代码从

for (const file of files) {
            const tempPath = file[1].filepath;
            await fs.rename(tempPath, targetPath + file[1].originalFilename);
        }

转换为以下代码

for (const file of files) {
      const tempPath = file[1].filepath;
      await fs.copyFile(tempPath, targetPath + file[1].originalFilename);
      await fs.rm(tempPath);
    }

而且对我来说很好用
我认为问题在于我们无法直接从节点移动临时文件

相关问题