Sao chép thư mục đệ quy trong node.js


154

Có một cách dễ dàng hơn để sao chép một thư mục và tất cả các nội dung của nó không bằng tay làm một chuỗi các fs.readir, fs.readfile,fs.writefile đệ quy?

Chỉ tự hỏi nếu tôi thiếu một chức năng lý tưởng sẽ làm việc như thế này

fs.copy("/path/to/source/folder","/path/to/destination/folder");

3
Có cách nào để làm điều này mà không cần bất kỳ mô-đun? Có lẽ một hàm đệ quy / mã snip-it?
Sukima

@Sukima - Xem câu trả lời của tôi ở đây .
jmort253

Câu trả lời:


121

Bạn có thể sử dụng mô-đun ncp . Tôi nghĩ rằng đây là những gì bạn cần


2
Hoàn hảo! npm install ncpvà làm việc trong ít hơn 30 giây. Cảm ơn.
Aebsubis

1
Cờ lê tốt hơn cho tôi, vì nó hỗ trợ nhiều lựa chọn hơn. Với NCP, bạn không thể giải quyết các liên kết tượng trưng chẳng hạn.
Slava Fomin II

3
Là một phần thưởng tuyệt vời, người ta có thể sử dụng ncp trong một kịch bản chạy npm đa nền tảng.
Ciantic

Tôi đã nhận được một số trường hợp đơn giản trong đó ncp không thực hiện trong cuộc gọi lại của tôi, nơi fs-Extra thực hiện đúng.
gầm gừ

40
Xin lưu ý rằng ncp dường như không rõ ràng . fs-Extra có lẽ là lựa chọn tốt nhất để thay thế.
chris

74

Đây là cách tiếp cận của tôi để giải quyết vấn đề này mà không cần thêm bất kỳ mô-đun nào. Chỉ cần sử dụng tích hợp fspathmô-đun.

Lưu ý: Điều này không sử dụng các chức năng đọc / ghi của fs để nó không sao chép bất kỳ dữ liệu meta nào (thời gian tạo, v.v.). Kể từ nút 8.5, có một copyFileSyncchức năng có sẵn để gọi các chức năng sao chép hệ điều hành và do đó cũng sao chép dữ liệu meta. Tôi chưa kiểm tra chúng, nhưng nó chỉ hoạt động để thay thế chúng. (Xem https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags )

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

function copyFileSync( source, target ) {

    var targetFile = target;

    //if target is a directory a new file with the same name will be created
    if ( fs.existsSync( target ) ) {
        if ( fs.lstatSync( target ).isDirectory() ) {
            targetFile = path.join( target, path.basename( source ) );
        }
    }

    fs.writeFileSync(targetFile, fs.readFileSync(source));
}

function copyFolderRecursiveSync( source, target ) {
    var files = [];

    //check if folder needs to be created or integrated
    var targetFolder = path.join( target, path.basename( source ) );
    if ( !fs.existsSync( targetFolder ) ) {
        fs.mkdirSync( targetFolder );
    }

    //copy
    if ( fs.lstatSync( source ).isDirectory() ) {
        files = fs.readdirSync( source );
        files.forEach( function ( file ) {
            var curSource = path.join( source, file );
            if ( fs.lstatSync( curSource ).isDirectory() ) {
                copyFolderRecursiveSync( curSource, targetFolder );
            } else {
                copyFileSync( curSource, targetFolder );
            }
        } );
    }
}

nó không sao chép các thư mục nếu chúng có không gian trong tên của chúng
31415926

Đối với tôi, nó sao chép các thư mục có khoảng trắng trong tên của chúng. Có thể nguyên nhân là do lỗi được sửa bởi @victor. Vì tôi đang sử dụng chức năng này khá thường xuyên (ở trạng thái hiện tại, vì tôi quên cập nhật công cụ chỉnh sửa rất giống nhau), tôi khá chắc chắn rằng nó hoạt động chung.
Simon Zyx

1
Cũng cần: javascript var fs = require('fs'); var path = require('path');
Tyler

2
Điều này không thực sự sao chép các tập tin. Nó đọc chúng sau đó viết chúng. Đó không phải là sao chép. Sao chép bao gồm ngày tạo cũng như các luồng dữ liệu meta khác mà cả Windows và MacOS đều hỗ trợ và không được sao chép bởi mã này. Kể từ nút 8.5, bạn nên gọi fs.copyhoặc fs.copySynckhi chúng thực sự gọi các chức năng sao chép mức hệ điều hành trong MacOS và Windows và do đó thực sự sao chép các tệp.
gman

1
xin lỗi fs.copyFilevà nếu bạn đào qua nguồn nút bạn sẽ thấy trên Mac và Windows, họ sẽ gọi chức năng cụ thể của hệ điều hành để sao chép tệp
gman

52

Có một số mô-đun hỗ trợ sao chép các thư mục với nội dung của chúng. Phổ biến nhất sẽ là cờ lê

// Deep-copy an existing directory
wrench.copyDirSyncRecursive('directory_to_copy', 'location_where_copy_should_end_up');

Một thay thế sẽ là nút-fs-thêm

fs.copy('/tmp/mydir', '/tmp/mynewdir', function (err) {
  if (err) {
    console.error(err);
  } else {
    console.log("success!");
  }
}); //copies directory, even if it has subdirectories or files

3
cờ lê không thành công nếu thư mục để sao chép có chứa một liên kết tượng trưng
DoubleMalt

2
Nó cũng bị lỗi trên Windows nếu thư mục đã tồn tại, ncp hoạt động ngay lập tức.
thổi vào

6
nút-fs-thêm làm việc cho tôi. Nó kế thừa fs gốc và tôi thích cách xử lý của nó. Ít mã hơn để cập nhật trong ứng dụng.
dvdmn

15
Xin lưu ý rằng wrenchđã bị phản đối và nên được thay thế bằng node-fs-extra( github.com/jprichardson/node-fs-extra )
Ambidex

1
Cờ lê không thực sự sao chép các tập tin. Nó đọc chúng sau đó viết chúng, sau đó sao chép ngày của chúng. Đó không phải là sao chép. Sao chép bao gồm các luồng dữ liệu meta khác mà cả Windows và MacOS đều hỗ trợ và không được sao chép bằng cờ lê.
gman

38

Đây là một chức năng sao chép đệ quy một thư mục và nội dung của nó sang một thư mục khác:

const fs = require("fs")
const path = require("path")

/**
 * Look ma, it's cp -R.
 * @param {string} src The path to the thing to copy.
 * @param {string} dest The path to the new copy.
 */
var copyRecursiveSync = function(src, dest) {
  var exists = fs.existsSync(src);
  var stats = exists && fs.statSync(src);
  var isDirectory = exists && stats.isDirectory();
  if (isDirectory) {
    fs.mkdirSync(dest);
    fs.readdirSync(src).forEach(function(childItemName) {
      copyRecursiveSync(path.join(src, childItemName),
                        path.join(dest, childItemName));
    });
  } else {
    fs.copyFileSync(src, dest);
  }
};

3
Ngay cả khi bạn sẽ chèn một chức năng sao chép thực, bạn không nên theo các liên kết tượng trưng (sử dụng fs.lstatSyncthay vì fs.statSync)
Simon Zyx

3
Điều có thể gây ra sự nhầm lẫn này là fs.unlink xóa các tệp, nhưng fs.link không sao chép mà là liên kết.
Simon Zyx

3
@SimonSeyock: đúng .. CNTT linkingkhông sao chép .. Vấn đề là khi bạn sửa đổi nội dung của tệp được liên kết, tệp gốc cũng sẽ thay đổi.
Abdennour TOUMI


22

Đối với hệ điều hành linux / unix, bạn có thể sử dụng cú pháp shell

const shell = require('child_process').execSync ; 

const src= `/path/src`;
const dist= `/path/dist`;

shell(`mkdir -p ${dist}`);
shell(`cp -r ${src}/* ${dist}`);

Đó là nó!


1
Chào mừng bạn
Abdennour TOUMI 22/03/2017

1
Đây là giải pháp đơn giản nhất. Không cần phải phát minh lại các công cụ UNIX!
Michael Franzl

11
vì nodejs chạy trên OSX / linux / windows, đây chỉ là câu trả lời cho 2 chứ không phải tất cả 3.
mjwrazor

2
@AbdennourTOUMI nếu bạn đang chạy trên máy chủ windows.
mjwrazor

3
Đó là lý do tại sao tôi bắt đầu câu trả lời bằng "Đối với hệ điều hành linux / unix, bạn có thể sử dụng cú pháp shell .."
Abdennour TOUMI

19

mô-đun fs-Extra hoạt động như một nét duyên dáng.

Cài đặt thêm fs

$ npm install fs-extra

Sau đây là chương trình sao chép thư mục nguồn vào thư mục đích.

// include fs-extra package
var fs = require("fs-extra");

var source = 'folderA'
var destination = 'folderB'

// copy source folder to destination
fs.copy(source, destination, function (err) {
    if (err){
        console.log('An error occured while copying the folder.')
        return console.error(err)
    }
    console.log('Copy completed!')
});

Người giới thiệu

fs-thêm: https://www.npmjs.com/package/fs-extra

Ví dụ: Hướng dẫn NodeJS - Node.js Sao chép thư mục


quá trình này thay thế thư mục hoặc hợp nhất với nó?
SM Shahinul Hồi giáo

14

Đây là cách tôi sẽ làm điều đó cá nhân:

function copyFolderSync(from, to) {
    fs.mkdirSync(to);
    fs.readdirSync(from).forEach(element => {
        if (fs.lstatSync(path.join(from, element)).isFile()) {
            fs.copyFileSync(path.join(from, element), path.join(to, element));
        } else {
            copyFolderSync(path.join(from, element), path.join(to, element));
        }
    });
}

hoạt động cho các thư mục và tập tin


3
Giải pháp này là ngắn gọn và đơn giản. Đây sẽ là gần như chính xác cách tôi làm nó, vì vậy +1 từ tôi. Bạn nên cải thiện câu trả lời của mình bằng các bình luận trong mã của bạn và mô tả lý do tại sao giải pháp này được ưa thích hơn các giải pháp khác và những nhược điểm của nó có thể có. - Cũng cập nhật những mô-đun nó yêu cầu. ("đường dẫn", "fs")
Andrew

kiểm tra xem thư mục tồn tại ở trên cùng ... sẽ cứu mạng ;-) if (! fs.existsSync (to)) fs.mkdirSync (to);
Tobias

9

Tôi đã tạo một ví dụ hoạt động nhỏ sao chép thư mục nguồn sang thư mục đích khác chỉ trong vài bước (dựa trên câu trả lời @ shift66 bằng ncp):

Bước 1 - Cài đặt mô-đun ncp:

npm install ncp --save

bước 2 - tạo copy.js (sửa đổi srcPath và DestPath vars thành bất cứ thứ gì bạn cần):

var path = require('path');
var ncp = require('ncp').ncp;

ncp.limit = 16;

var srcPath = path.dirname(require.main.filename); //current folder
var destPath = '/path/to/destination/folder'; //Any destination folder

console.log('Copying files...');
ncp(srcPath, destPath, function (err) {
  if (err) {
    return console.error(err);
  }
  console.log('Copying files complete.');
});

bước 3 - chạy

node copy.js

7

Điều này khá dễ dàng với nút 10.

const FSP = require('fs').promises;

async function copyDir(src,dest) {
    const entries = await FSP.readdir(src,{withFileTypes:true});
    await FSP.mkdir(dest);
    for(let entry of entries) {
        const srcPath = Path.join(src,entry.name);
        const destPath = Path.join(dest,entry.name);
        if(entry.isDirectory()) {
            await copyDir(srcPath,destPath);
        } else {
            await FSP.copyFile(srcPath,destPath);
        }
    }
}

Giả định destnày không tồn tại.


3
Chúng ta có thể làm cho điều này hoạt động trong Nút 8.x bằng cách sử dụng require('util').promisifyvới fs.mkdirfs.copyFilethay vì require('fs').promises, vẫn đang thử nghiệm tại v11.1.
Sơn Trần-Nguyễn

@sntran 8.x có withFileTypestùy chọn không? Bởi vì điều đó giúp bạn tiết kiệm một statcuộc gọi
mpen 16/11/18

Thật không may, 8.x không có withFileTypestùy chọn.
Sơn Trần-Nguyễn

@ SơnTrần-Nguyễn 8.x đến hết cuộc đời vào ngày 31 tháng 12 năm 2019 - có thể là thời gian để nâng cấp :-)
mở cửa

6

Tôi biết rất nhiều câu trả lời đã có ở đây nhưng không ai trả lời nó một cách đơn giản. Về tài liệu chính thức của fs-exra , bạn có thể làm điều đó rất dễ dàng

const fs = require('fs-extra')

// copy file
fs.copySync('/tmp/myfile', '/tmp/mynewfile')

// copy directory, even if it has subdirectories or files
fs.copySync('/tmp/mydir', '/tmp/mynewdir')

đảm bảo đặt tùy chọn đệ quy. fs.copySync ('/ tmp / mydir', '/ tmp / mynewdir', {đệ quy: đúng})
Dheeraj Kumar

Tôi không thể tìm thấy tùy chọn { recursive: true }từ tài liệu github mà bạn đã đề cập, Không biết là nó hoạt động.
Freddy Daniel

Tôi đoán chúng ta đang nói về fs-Extra, nhưng liên kết github của bạn trỏ đến nút-fs-Extra. Có thể là thư viện khác nhau?
Dheeraj Kumar

@DheerajKumar, Nó hiển thị nút-fs-thêm trong github nhưng fs-thêm trong npm . Tôi không biết cả hai đều giống nhau, vui lòng tham khảo gói từ npm
Freddy Daniel

Có fs-thêm thay thế fs?
Matt

4

Vì tôi chỉ đang xây dựng một tập lệnh nút đơn giản, tôi không muốn người dùng tập lệnh cần nhập một loạt các mô-đun và phụ thuộc bên ngoài, vì vậy tôi đã đặt trên nắp suy nghĩ của mình và thực hiện tìm kiếm để chạy các lệnh từ bash vỏ.

Đoạn mã node.js này sao chép đệ quy một thư mục có tên là node-webkit.app vào một thư mục có tên là build:

   child = exec("cp -r node-webkit.app build", function(error, stdout, stderr) {
        sys.print("stdout: " + stdout);
        sys.print("stderr: " + stderr);
        if(error !== null) {
            console.log("exec error: " + error);
        } else {

        }
    });

Cảm ơn Lance Pollard tại dzone đã giúp tôi bắt đầu.

Đoạn mã trên được giới hạn trong các nền tảng dựa trên Unix như Mac OS và Linux, nhưng một kỹ thuật tương tự có thể hoạt động cho Windows.


4

@ mallikarjun-m cảm ơn bạn!

fs-Extra đã làm điều đó và nó thậm chí có thể trả lại Promise nếu bạn không cung cấp cuộc gọi lại! :)

const path = require('path')
const fs = require('fs-extra')

let source = path.resolve( __dirname, 'folderA')
let destination = path.resolve( __dirname, 'folderB')

fs.copy(source, destination)
  .then(() => console.log('Copy completed!'))
  .catch( err => {
    console.log('An error occured while copying the folder.')
    return console.error(err)
  })

2

Cái có hỗ trợ liên kết tượng trưng + không ném nếu thư mục tồn tại.

function copyFolderSync(from, to) {
  try {
    fs.mkdirSync(to);
  } catch(e) {}

  fs.readdirSync(from).forEach((element) => {
    const stat = fs.lstatSync(path.join(from, element));
    if (stat.isFile()) {
      fs.copyFileSync(path.join(from, element), path.join(to, element));
    } else if (stat.isSymbolicLink()) {
      fs.symlinkSync(fs.readlinkSync(path.join(from, element)), path.join(to, element));
    } else if (stat.isDirectory()) {
      copyFolderSync(path.join(from, element), path.join(to, element));
    }
  });
}

1

Mã này sẽ hoạt động tốt, sao chép đệ quy bất kỳ thư mục nào vào bất kỳ vị trí nào. Chỉ có Windows.

var child=require("child_process");
function copySync(from,to){
    from=from.replace(/\//gim,"\\");
    to=to.replace(/\//gim,"\\");
    child.exec("xcopy /y /q \""+from+"\\*\" \""+to+"\\\"");
}

Hoạt động hoàn hảo cho trò chơi Dựa trên văn bản của tôi để tạo người chơi mới.


1

Tôi đã thử fs-Extra và copy-dir để sao chép thư mục-đệ quy. nhưng tôi muốn điều đó

  1. hoạt động bình thường (copy-dir ném lỗi không thể khắc phục)
  2. cung cấp hai đối số trong bộ lọc: filepath và filetype (fs-Extra không cho filetype)
  3. có kiểm tra dir-to-subir và kiểm tra dir-to-file

Vì vậy, tôi đã viết của riêng tôi:

//node module for node 8.6+
var path=require("path");
var fs=require("fs");

function copyDirSync(src,dest,options){
  var srcPath=path.resolve(src);
  var destPath=path.resolve(dest);
  if(path.relative(srcPath,destPath).charAt(0)!=".")
    throw new Error("dest path must be out of src path");
  var settings=Object.assign(Object.create(copyDirSync.options),options);
  copyDirSync0(srcPath,destPath,settings);
  function copyDirSync0(srcPath,destPath,settings){
    var files=fs.readdirSync(srcPath);
    if (!fs.existsSync(destPath)) {
      fs.mkdirSync(destPath);
    }else if(!fs.lstatSync(destPath).isDirectory()){
      if(settings.overwrite)
        throw new Error(`Cannot overwrite non-directory '${destPath}' with directory '${srcPath}'.`);
      return;
    }
    files.forEach(function(filename){
      var childSrcPath=path.join(srcPath,filename);
      var childDestPath=path.join(destPath,filename);
      var type=fs.lstatSync(childSrcPath).isDirectory()?"directory":"file";
      if(!settings.filter(childSrcPath,type))
        return;
      if (type=="directory") {
        copyDirSync0(childSrcPath,childDestPath,settings);
      } else {
        fs.copyFileSync(childSrcPath, childDestPath, settings.overwrite?0:fs.constants.COPYFILE_EXCL);
        if(!settings.preserveFileDate)
          fs.futimesSync(childDestPath,Date.now(),Date.now());
      }
    });
  }
}
copyDirSync.options={
  overwrite: true,
  preserveFileDate: true,
  filter: function(filepath,type){return true;}
};

và một mkdirs chức năng tương tự, là một thay thế cho mkdirp

function mkdirsSync(dest) {
  var destPath=path.resolve(dest);
  mkdirsSync0(destPath);
  function mkdirsSync0(destPath){
    var parentPath=path.dirname(destPath);
    if(parentPath==destPath)
      throw new Error(`cannot mkdir ${destPath}, invalid root`);
    if (!fs.existsSync(destPath)) {
      mkdirsSync0(parentPath);
      fs.mkdirSync(destPath);
    }else if(!fs.lstatSync(destPath).isDirectory()){
      throw new Error(`cannot mkdir ${destPath}, a file already exists there`);
    }
  }
}

0

Tôi đã viết hàm này cho cả hai tệp sao chép (copyFileSync) hoặc di chuyển (renameSync) đệ quy giữa các thư mục:

//copy files
copyDirectoryRecursiveSync(sourceDir, targetDir);
//move files
copyDirectoryRecursiveSync(sourceDir, targetDir, true);


function copyDirectoryRecursiveSync(source, target, move) {
if (!fs.lstatSync(source).isDirectory()) return;

var operation = move ? fs.renameSync : fs.copyFileSync;
fs.readdirSync(source).forEach(function (itemName) {
    var sourcePath = path.join(source, itemName);
    var targetPath = path.join(target, itemName);

    if (fs.lstatSync(sourcePath).isDirectory()) {
        fs.mkdirSync(targetPath);
        copyDirectoryRecursiveSync(sourcePath, targetDir);
    }
    else {
        operation(sourcePath, targetPath);
    }
});}

0

Nếu bạn đang ở trong Linux và hiệu suất không phải là vấn đề, bạn có thể sử dụng execchức năng từ child_processmô-đun để thực hiện lệnh bash:

const { exec } = require('child_process');
exec('cp -r source dest', (error, stdout, stderr) => {...});

Trong một số trường hợp, tôi thấy giải pháp này sạch hơn so với tải xuống toàn bộ mô-đun hoặc thậm chí sử dụng fsmô-đun.


0

ncp khóa bộ mô tả tập tin và thực hiện gọi lại khi nó chưa được mở khóa. Tôi khuyên bạn nên sử dụng mô-đun sao chép đệ quy thay thế. Nó hỗ trợ các sự kiện và bạn có thể chắc chắn trong bản sao kết thúc.


0

Hãy cẩn thận khi chọn gói của bạn. Một số gói như copy-dir không hỗ trợ sao chép tệp lớn hơn 0x1fffffe8 ký tự. Nó sẽ đưa ra một số lỗi như:

buffer.js:630 Uncaught Error: Cannot create a string longer than 0x1fffffe8 characters 

Tôi đã trải nghiệm một cái gì đó như thế này trong một trong các dự án của tôi. Cuối cùng, tôi đã phải thay đổi gói tôi đang sử dụng và điều chỉnh rất nhiều mã. Tôi sẽ nói rằng đây không phải là một kinh nghiệm rất dễ chịu.

Nếu muốn có nhiều nguồn và nhiều bản sao đích, bạn có thể sử dụng bản sao tốt hơn và viết một cái gì đó như thế này:

// copy from multiple source into a directory
bCopy(['/path/to/your/folder1', '/path/to/some/file.txt'], '/path/to/destination/folder');

hoặc thậm chí:

// copy from multiple source into multiple destination
bCopy(['/path/to/your/folder1', '/path/to/some/file.txt'], ['/path/to/destination/folder', '/path/to/another/folder']);

-1

CÓ, ncpcoolmặc dù ...

Bạn có thể muốn / nên quảng bá chức năng của nó để thực hiện super cool. Vì bạn đang ở đó, hãy thêm nó vào một toolstệp để sử dụng lại.

Dưới đây là một phiên bản làm việc được Asyncvà sử dụng Promises.


index.js

const {copyFolder} = require('./tools/');

return copyFolder(
    yourSourcePath,
    yourDestinationPath
)
.then(() => {
    console.log('-> Backup completed.')
}) .catch((err) => {
    console.log("-> [ERR] Could not copy the folder: ", err);
})

tools.js

const ncp = require("ncp");

/**
 * Promise Version of ncp.ncp()
 * 
 * This function promisifies ncp.ncp().
 * We take the asynchronous function ncp.ncp() with 
 * callback semantics and derive from it a new function with
 * promise semantics.
 */
ncp.ncpAsync = function (sourcePath, destinationPath) {
  return new Promise(function (resolve, reject) {
      try {
          ncp.ncp(sourcePath, destinationPath, function(err){
              if (err) reject(err); else resolve();
          });
      } catch (err) {
          reject(err);
      }
  });
};

/**
 * Utility function to copy folders asynchronously using
 * the Promise returned by ncp.ncp(). 
 */
const copyFolder = (sourcePath, destinationPath) => {
    return ncp.ncpAsync(sourcePath, destinationPath, function (err) {
        if (err) {
            return console.error(err);
        }
    });
}
module.exports.copyFolder = copyFolder;

-1

Cách tiếp cận dễ nhất cho vấn đề này là chỉ sử dụng mô đun 'fs' và 'Path' và một số logic .....

Tất cả các tệp trong thư mục gốc sao chép với Tên mới nếu bạn chỉ muốn đặt số phiên bản tức là ....................... "var v = 'Thư mục của bạn Tên'"

trong tên tệp Tiền tố nội dung V được thêm vào với tên tệp.

var fs = require('fs-extra');
var path = require('path');

var c = 0;
var i =0 ;
var v = "1.0.2";
var copyCounter = 0;
var directoryCounter = 0; 
var directoryMakerCounter = 0;
var recursionCounter = -1;
var Flag = false;
var directoryPath = [] ;
var directoryName = [] ;
var directoryFileName = [];
var fileName;
var directoryNameStorer;
var dc = 0;
var route ;



if (!fs.existsSync(v)){
   fs.mkdirSync(v);
}

var basePath = path.join(__dirname, v);


function walk(dir){

  fs.readdir(dir, function(err, items) {

    items.forEach(function(file){

        file = path.resolve(dir, file);

        fs.stat(file, function(err, stat){
            if(stat && stat.isDirectory()){

                directoryNameStorer = path.basename(file);
                route = file;
                route = route.replace("gd",v);

                directoryFileName[directoryCounter] = route;
                directoryPath[directoryCounter] = file;
                directoryName[directoryCounter] = directoryNameStorer;

                directoryCounter++;
                dc++;

                if (!fs.existsSync(basePath+"/"+directoryName[directoryMakerCounter])){
                    fs.mkdirSync(directoryFileName[directoryMakerCounter]);
                    directoryMakerCounter++;
                }

            }else{

                    fileName = path.basename(file);
                    if(recursionCounter >= 0){
                        fs.copyFileSync(file, directoryFileName[recursionCounter]+"/"+v+"_"+fileName, err => {
                            if(err) return console.error(err);
                        });
                        copyCounter++;
                    }else{
                        fs.copyFileSync(file, v+"/"+v+"_"+fileName, err => {
                            if(err) return console.error(err);
                        });
                        copyCounter++;    
                    }

                }
                if(copyCounter + dc == items.length && directoryCounter > 0 && recursionCounter < directoryMakerCounter-1){
                    console.log("COPY COUNTER :             "+copyCounter);
                    console.log("DC COUNTER :               "+dc);                        
                    recursionCounter++;
                    dc = 0;
                    copyCounter = 0;
                    console.log("ITEM DOT LENGTH :          "+items.length);
                    console.log("RECURSION COUNTER :        "+recursionCounter);
                    console.log("DIRECOTRY MAKER COUNTER :  "+directoryMakerCounter);
                    console.log(": START RECURSION :        "+directoryPath[recursionCounter]);
                    walk(directoryPath[recursionCounter]); //recursive call to copy sub-folder

                }

        })
    })
 });

}
 walk('./gd', function(err, data){ //Just Pass The Root Directory Which You Want to Copy
 if(err) throw err;
 console.log("done");
})

-1

Đây là cách tôi đã làm:

let fs = require('fs');
let path = require('path');

sau đó:

let filePath = //your FilePath

let fileList = []
        var walkSync = function(filePath, filelist) 
        {
          let files = fs.readdirSync(filePath);
          filelist = filelist || [];
          files.forEach(function(file) 
          {
            if (fs.statSync(path.join(filePath, file)).isDirectory()) 
            {
              filelist = walkSync(path.join(filePath, file), filelist);
            }
            else 
            {
              filelist.push(path.join(filePath, file));
            }
          });

          // Ignore hidden files
          filelist = filelist.filter(item => !(/(^|\/)\.[^\/\.]/g).test(item));

          return filelist;
        };

Sau đó gọi methode:

This.walkSync(filePath, fileList)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.