Что означает ошибка "EXDEV: ссылка между устройствами запрещена"?

Что на самом деле означает эта ошибка? Что такое "ссылка между устройствами"?

Он упоминается на этой странице libuv, но не содержит никаких подробностей, кроме "ссылка на другое устройство не разрешена".

6 ответов

Решение

Используется для EXDEV в Linux:

Увидеть man rename страница руководства:

EXDEV oldpath и newpath не находятся в одной и той же смонтированной файловой системе. (Linux позволяет монтировать файловую систему в нескольких точках, но метод rename() не работает в разных точках монтирования, даже если одна и та же файловая система смонтирована в обеих.)

Эта ошибка также используется, когда есть ERROR_NOT_SAME_DEVICE в Windows см.:

Для получения дополнительной информации см.:

winerror.h 0x80070011 #define ERROR_NOT_SAME_DEVICE Система не может переместить файл на другой диск.

Похоже, вы пытаетесь переименовать файл через границы "устройства" (раздела).

Скажи это /tmp это другой раздел, чем /, Это означает, что вам не разрешено делать это:

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

(то же самое относится к fs.renameSync() как хорошо, очевидно)

Если вы хотите сделать это, вам необходимо сначала скопировать файл в его новое местоположение, а затем удалить старый файл. Есть модули, такие как mv, это может помочь вам в этом.

Я думаю, вы пытаетесь скопировать файл из /tempпапка с формы. Я решил справиться, а не переименовать

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

Просто для тех, кто использует Linux, это происходит, когда ваш старый путь, т.е. /tmp и новые пути находятся на разных разделах или дисках.

В моем случае я меняю код с

      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);
    }

а у меня нормально работает

Я думаю, проблема в том, что мы не можем переместить временный файл напрямую из узла.

В моем случае, используя Node v16.20, я изменил:

      await fs.promises.rename(appPath, targetDir)

к

      await fs.promises.cp(appPath, targetDir, {
    recursive: true,
})
await fs.promises.rm(appPath, {
    recursive: true,
})
Другие вопросы по тегам