Copy folder recursively in Node.js

前端 未结 25 2011
隐瞒了意图╮
隐瞒了意图╮ 2020-12-04 07:44

Is there an easier way to copy a folder and all its content without manually doing a sequence of fs.readir, fs.readfile, fs.writefile

25条回答
  •  情话喂你
    2020-12-04 08:09

    The easiest approach for this problem is to use only the 'fs' and 'Path' module and some logic...

    All files in the root folder copy with the new name if you want to just set the version number, i.e., " var v = 'Your Directory Name'"

    In the file name prefix with content added with the file name.

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

提交回复
热议问题