如何使用nodejs fs将父目录文件复制到子目录?

时间:2020-10-07 19:04:33

标签: javascript node.js fs

试图将父内容复制到子目录时会引发以下错误。有人知道我在哪里做错了吗?有没有更好的方法来完成此任务?

main.js

   const fse = require('fs-extra');
    const copyDirectories = function(data) {
            let source ='/Users/Test';
            let destination = '/Users/Test/tmp';
            fse.copy(source, destination)
            .then(() => console.log('Copy completed!'))
            .catch( err => {
                console.log('An error occured while copying the folder.')
                return console.error(err)
            })
    
            return data;
         }

错误

 Cannot copy '/Users/Test' to a subdirectory of itself, '/Users/Test/tmp'.

2 个答案:

答案 0 :(得分:0)

首先,子目录是父目录的内容。那么,子目录如何将自身存储在其中?因此,我认为解决此问题的好方法是复制父目录的所有内容,但要复制所有内容的子目录除外。

答案 1 :(得分:0)

这是隐含的,您不会将/ Users / Test / tmp的内容复制到/ Users / Test / tmp / tmp中(这是递归错误,会引发您收到的错误消息)

您有两个选择:

  1. 您将/ Users / Test复制到/ tmp,然后将/ tmp移到/ Users / Test / tmp(如果您有权访问/ tmp)
  2. 您将/ Users / Test的所有条目(不包括/ Users / Test / tmp)复制到/ Users / Test / tmp

我认为没有其他选择。

选项2的代码示例:

const fs = require("fs");
const fse = require('fs-extra');

const copyDirectories = (data, source, destination) => {
   fs.readdirSync(source,{withFileTypes: true}).filter(
       (entry) => {
           const fullsrc = path.resolve(source + path.sep + entry.name);
           const fulldest= path.resolve(destination + path.sep + entry.name);
           if(entry.isDirectory && fullsrc !== destination)
               fse.copySync(fullsrc, fulldest);
           else if(!entry.isDirectory)
               fs.copySync(fullsrc, fulldest);
           return true;
       }
   );
   return data;
}

一些评论:

  1. 我没有使用fse.copy的过滤器,因为在过滤源目录差异之前引发了非包含错误
  2. 我使用了Sync版本,因为原始代码看起来不像异步
  3. 我仍然不知道为什么在函数末尾会返回一个data参数,但是无论如何我还是保留了它
相关问题