在node.js中使用fs模块复制文件夹报错“no such file or directory, mkdir“

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在node.js中使用fs模块复制文件夹报错“no such file or directory, mkdir“相关的知识,希望对你有一定的参考价值。

异常

Error: ENOENT: no such file or directory, mkdir
    at Object.mkdirSync (node:fs:1334:3)
    at F:\\Pre_Coding\\Pre_WebStorm_Project\\linux-trash-nodejs\\trash.js:82:20
    at Array.forEach (<anonymous>)
    at copyDirectory (F:\\Pre_Coding\\Pre_WebStorm_Project\\linux-trash-nodejs\\trash.js:74:11)
    at Object.<anonymous> (F:\\Pre_Coding\\Pre_WebStorm_Project\\linux-trash-nodejs\\trash.js:46:13)
    at Module._compile (node:internal/modules/cjs/loader:1097:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1149:10)
    at Module.load (node:internal/modules/cjs/loader:975:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) 
  errno: -4058,
  syscall: 'mkdir',
  code: 'ENOENT'

错误代码

在Linux系统上执行此复制文件夹的代码,报上面的错:

var fs = require('fs')
var path = require('path')

/**
 * 将指定src目录下的所有文件复制(剪切)到指定目标dest目录下
 * @param src 源目录
 * @param dest 目标目录
 */
function copyDirectory(src, dest) 
    var files = fs.readdirSync(src);
    files.forEach((item, index) => 
        var itemPath = path.join(src, item);
        var itemStat = fs.statSync(itemPath);// 获取文件信息
        var savedPath = path.join(dest, itemPath.replace(src, ''));
        var savedDir = savedPath.substring(0, savedPath.lastIndexOf('\\\\'));
        if (itemStat.isFile()) 
            // 如果目录不存在则进行创建
            if (!fs.existsSync(savedDir)) 
                fs.mkdirSync(savedDir, recursive: true);
            
            // 写入到新目录下
            var data = fs.readFileSync(itemPath);
            fs.writeFileSync(savedPath, data);
            // 并且删除原文件
            fs.unlinkSync(itemPath);
         else if (itemStat.isDirectory()) 
            copyDirectory(itemPath, path.join(savedDir, item));
        
    );
    // 并且删除原目录
    fs.rmdirSync(src);


// copyDirectory('D:\\\\NodeJs\\\\node-demo\\\\abc', 'G:\\\\Trash\\\\files\\\\abc');
copyDirectory('/root/home/hello', '/root/home/Trash');

原因

这份代码在Windows系统环境下并不会报错,错误提示no such file or directory, mkdir说没有这个目录,即创建目录时传入的目录路径不对。

但在Windows系统下运行该代码是正确的,怎么到Linux系统就不行了,这才是导致这个错误发生的根本原因。

问题就出现在var savedDir = savedPath.substring(0, savedPath.lastIndexOf('\\\\'));这行代码上,获取要保存的目录,如G:\\Trash\\files\\abc\\a.txt经过该行代码后返回G:\\Trash\\files\\abc,是使用\\\\分隔符进行提取的,但是在Linux系统上的路径分隔符是\\,这才是问题的关键。

因为Windows系统的路径分隔符是\\,而Linux系统的路径分隔符是/

解决

我们可以根据是什么系统就用什么路径分隔符,通过path模块的sep属性来获取当前使用系统的路径分隔符,即path.sep。如果是Windows系统则输出\\,如果是Linux系统则输出/

正确代码

var fs = require('fs')
var path = require('path')

/**
 * 将指定src目录下的所有文件复制(剪切)到指定目标dest目录下
 * @param src 源目录
 * @param dest 目标目录
 */
function copyDirectory(src, dest) 
    var files = fs.readdirSync(src);
    files.forEach((item, index) => 
        var itemPath = path.join(src, item);
        var itemStat = fs.statSync(itemPath);// 获取文件信息
        var savedPath = path.join(dest, itemPath.replace(src, ''));
        var savedDir = savedPath.substring(0, savedPath.lastIndexOf(path.sep));// 根据系统获取分隔符
        if (itemStat.isFile()) 
            // 如果目录不存在则进行创建
            if (!fs.existsSync(savedDir)) 
                fs.mkdirSync(savedDir, recursive: true);
            
            // 写入到新目录下
            var data = fs.readFileSync(itemPath);
            fs.writeFileSync(savedPath, data);
            // 并且删除原文件
            fs.unlinkSync(itemPath);
         else if (itemStat.isDirectory()) 
            copyDirectory(itemPath, path.join(savedDir, item));
        
    );
    // 并且删除原目录
    fs.rmdirSync(src);


// copyDirectory('D:\\\\NodeJs\\\\node-demo\\\\abc', 'G:\\\\Trash\\\\files\\\\abc');
copyDirectory('/root/home/hello', '/root/home/Trash');

以上是关于在node.js中使用fs模块复制文件夹报错“no such file or directory, mkdir“的主要内容,如果未能解决你的问题,请参考以下文章

node.js使用fs模块复制(剪切)目录和删除目录

Node.js文件系统(fs模块的使用)

Node.js fs文件系统相关操作

Node.js fs文件系统相关操作

Node.js 使用 fs 模块做文件 copy 的四种方法

Node.js 中 fs.renameSync 报错