<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 純異步nodejs文件夾(目錄)復(fù)制功能

            node.js 復(fù)制文件夾

            創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供利津網(wǎng)站建設(shè)、利津做網(wǎng)站、利津網(wǎng)站設(shè)計(jì)、利津網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、利津企業(yè)網(wǎng)站模板建站服務(wù),10年利津做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

            思路:

            1、callback 驅(qū)動(dòng)

            2、遞歸所有需要復(fù)制文件

            3、在一定閥值下并發(fā)復(fù)制文件

            var async = require("async"); 
            var fs = require("fs"); 
            var path = require("path"); 
            // cursively make dir  
            function mkdirs(p, mode, f, made) { 
              if (typeof mode === 'function' || mode === undefined) { 
                f = mode; 
                mode = 0777 & (~process.umask()); 
              } 
              if (!made) 
                made = null; 
              var cb = f || function () {}; 
              if (typeof mode === 'string') 
                mode = parseInt(mode, 8); 
              p = path.resolve(p); 
              fs.mkdir(p, mode, function (er) { 
                if (!er) { 
                  made = made || p; 
                  return cb(null, made); 
                } 
                switch (er.code) { 
                case 'ENOENT': 
                  mkdirs(path.dirname(p), mode, function (er, made) { 
                    if (er) { 
                      cb(er, made); 
                    } else { 
                      mkdirs(p, mode, cb, made); 
                    } 
                  }); 
                  break; 
                  // In the case of any other error, just see if there's a dir 
                  // there already. If so, then hooray! If not, then something 
                  // is borked. 
                default: 
                  fs.stat(p, function (er2, stat) { 
                    // if the stat fails, then that's super weird. 
                    // let the original error be the failure reason. 
                    if (er2 || !stat.isDirectory()) { 
                      cb(er, made); 
                    } else { 
                      cb(null, made) 
                    }; 
                  }); 
                  break; 
                } 
              }); 
            } 
            // single file copy 
            function copyFile(file, toDir, cb) { 
              async.waterfall([ 
                  function (callback) { 
                    fs.exists(toDir, function (exists) { 
                      if (exists) { 
                        callback(null, false); 
                      } else { 
                        callback(null, true); 
                      } 
                    }); 
                  }, function (need, callback) { 
                    if (need) { 
                      mkdirs(path.dirname(toDir), callback); 
                    } else { 
                      callback(null, true); 
                    } 
                  }, function (p, callback) { 
                    var reads = fs.createReadStream(file); 
                    var writes = fs.createWriteStream(path.join(path.dirname(toDir), path.basename(file))); 
                    reads.pipe(writes); 
                    //don't forget close the when all the data are read 
                    reads.on("end", function () { 
                      writes.end(); 
                      callback(null); 
                    }); 
                    reads.on("error", function (err) { 
                      console.log("error occur in reads"); 
                      callback(true, err); 
                    }); 
                  } 
                ], cb); 
            } 
            // cursively count the files that need to be copied 
            function _ccoutTask(from, to, cbw) { 
              async.waterfall([ 
                  function (callback) { 
                    fs.stat(from, callback); 
                  }, 
                  function (stats, callback) { 
                    if (stats.isFile()) { 
                      cbw.addFile(from, to); 
                      callback(null, []); 
                    } else if (stats.isDirectory()) { 
                      fs.readdir(from, callback); 
                    } 
                  }, 
                  function (files, callback) { 
                    if (files.length) { 
                      for (var i = 0; i < files.length; i++) { 
                        _ccoutTask(path.join(from, files[i]), path.join(to, files[i]), cbw.increase()); 
                      } 
                    } 
                    callback(null); 
                  } 
                ], cbw); 
            } 
            // wrap the callback before counting 
            function ccoutTask(from, to, cb) { 
              var files = []; 
              var count = 1; 
              function wrapper(err) { 
                count--; 
                if (err || count <= 0) { 
                  cb(err, files) 
                } 
              } 
              wrapper.increase = function () { 
                count++; 
                return wrapper; 
              } 
              wrapper.addFile = function (file, dir) { 
                files.push({ 
                  file : file, 
                  dir : dir 
                }); 
              } 
              _ccoutTask(from, to, wrapper); 
            } 
            function copyDir(from, to, cb) { 
              if(!cb){ 
               cb=function(){}; 
              } 
              async.waterfall([ 
                  function (callback) { 
                    fs.exists(from, function (exists) { 
                      if (exists) { 
                        callback(null, true); 
                      } else { 
                        console.log(from + " not exists"); 
                        callback(true); 
                      } 
                    }); 
                  }, 
                  function (exists, callback) { 
                    fs.stat(from, callback); 
                  }, 
                  function (stats, callback) { 
                    if (stats.isFile()) { 
                      // one file copy 
                      copyFile(from, to, function (err) { 
                        if (err) { 
                          // break the waterfall 
                          callback(true); 
                        } else { 
                          callback(null, []); 
                        } 
                      }); 
                    } else if (stats.isDirectory()) { 
                      ccoutTask(from, to, callback); 
                    } 
                  }, 
                  function (files, callback) {   
                    // prevent reaching to max file open limit      
                    async.mapLimit(files, 10, function (f, cb) { 
                      copyFile(f.file, f.dir, cb); 
                    }, callback); 
                  } 
                ], cb); 
            } 
            var start = new Date().getTime(); 
            copyDir("F:\\gear", "F:\\gear2", function (err) { 
              if (err) { 
                console.log("error ocur"); 
                console.dir(err); 
              } else { 
                console.log("copy ok"); 
                console.log("consume time:" + (new Date().getTime() - start)) 
              } 
            });

            總結(jié)

            以上所述是小編給大家介紹的純異步nodejs文件夾(目錄)復(fù)制,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!
            如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

            分享名稱:純異步nodejs文件夾(目錄)復(fù)制功能
            當(dāng)前網(wǎng)址:http://www.jbt999.com/article10/gjscdo.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、電子商務(wù)、ChatGPT、面包屑導(dǎo)航品牌網(wǎng)站建設(shè)、網(wǎng)站策劃

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

            網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 色骚综合 | 国产资源在线观看 | 秋霞AV一区二区三区 | 亚洲无人区码一码二码 | 国产精品一久久 |