>

js当三步跳件操作之文件拷贝与目录遍历的法子

- 编辑:正版管家婆马报彩图 -

js当三步跳件操作之文件拷贝与目录遍历的法子

文件拷贝 NodeJS 提供了宗旨的文本操作 API,可是像文件拷贝这种高端功用就从未有过提供,由此大家先拿文件拷贝程序练手。与 copy 命令类似,我们的主次要求能接受源文件路线与对象文件路线多个参数。

Node.js当麻芋果件操作之文件拷贝与目录遍历的主意,node.js拷贝

文件拷贝 NodeJS 提供了基本的文书操作 API,然则像文件拷贝这种高级功用就未有提供,由此大家先拿文件拷贝程序练手。与 copy 命令类似,大家的程序必要能接受源文件路线与对象文件路线三个参数。

小文件拷贝 小编们利用 NodeJS 内置的 fs 模块轻松达成那一个顺序如下。

var fs = require('fs');

function copy(src, dst) {
  fs.writeFileSync(dst, fs.readFileSync(src));
}

function main(argv) {
  copy(argv[0], argv[1]);
}

main(process.argv.slice(2));

以上程序采用 fs.readFileSync 从源路线读取文件内容,并采用fs.writeFileSync 将文件内容写入目的路线。

豆知识: process 是贰个全局变量,可通过 process.argv 得到命令行参数。由于 argv[0] 固定等于 NodeJS 试行顺序的相对路线,argv[1] 固定等于主模块的相对路线,因而首先个命令行参数从 argv[2] 那些地方上马。

大文件拷贝 上面包车型地铁顺序拷贝一些小文件没啥难点,但这种三回性把装有文件内容都读取到内部存款和储蓄器中后再壹遍性写入磁盘的点子不符合拷贝大文件,内部存款和储蓄器会爆仓。对于大文件,我们只可以读一些写一些,直到完成拷贝。因而下面的顺序须要退换如下。

var fs = require('fs');

function copy(src, dst) {
  fs.createReadStream(src).pipe(fs.createWriteStream(dst));
}

function main(argv) {
  copy(argv[0], argv[1]);
}

main(process.argv.slice(2));

以上程序行使 fs.createReadStream 创制了五个源文件的只读数据流,并应用 fs.createWriteStream 创造了三个目的文件的只写数据流,况兼用 pipe 方法把七个数据流连接了四起。连接起来后发生的思想政治工作,说得抽象点的话,水顺着水管从二个桶流到了另一个桶。

遍历目录

遍历目录是操作文件时的一个周边供给。比方写三个程序,要求找到并拍卖钦点目录下的富有JS文件时,就须要遍历整个目录。

递归算法 遍历目录时一般选取递归算法,不然就不便编写出简洁的代码。递归算法与数学归咎法类似,通过不停缩小难点的规模来减轻问题。以下示例表明了这种措施。

function factorial(n) {
  if (n === 1) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}

上边包车型大巴函数用于总结 N 的阶乘(N!)。能够看看,当 N 大于 1 时,问题简化为计算 N 乘以 N-1 的阶乘。当 N 等于 1 时,问题落成最小规模,不需求再简化,因而一向重临 1。

陷阱: 使用递归算法编写的代码即便轻便,但鉴于每递归贰遍就时有发生贰回函数调用,在需求事先思考质量时,供给把递归算法转换为循环算法,以减小函数调用次数。

遍历算法 目录是三个树状结构,在遍历时一般选拔深度优先+先序遍历算法。深度优先,意味着到达七个节点后,首先随着遍历子节点并非邻里节点。先序遍历,意味着第二回达到了某节点固然遍历完结,并不是终极三遍回到某节点才算数。由此使用这种遍历方式时,上面那棵树的遍历顺序是 A > B > D > E > C > F。

     A
     / 
    B  C
    /   
   D  E  F

一只遍历 打听了不可缺少的算法后,大家得以简轻巧单地贯彻以下目录遍历函数。

function travel(dir, callback) {
  fs.readdirSync(dir).forEach(function (file) {
    var pathname = path.join(dir, file);

    if (fs.statSync(pathname).isDirectory()) {
      travel(pathname, callback);
    } else {
      callback(pathname);
    }
  });
}

可以看来,该函数以有个别目录作为遍历的源点。蒙受叁个子目录时,就先跟着遍历子目录。境遇三个文本时,就把公文的相对路径传给回调函数。回调函数获得文件路线后,就可以做各类决断和处理。因而一旦有以下目录:

- /home/user/
  - foo/
    x.js
  - bar/
    y.js
  z.css

接纳以下代码遍历该目录时,获得的输入如下。

travel('/home/user', function (pathname) {
  console.log(pathname);
});

/home/user/foo/x.js
/home/user/bar/y.js
/home/user/z.css

异步遍历 借使读取目录或读取文件状态时选拔的是异步API,目录遍历函数实现起来会有些复杂,但原理完全同样。travel函数的异步版本如下。

function travel(dir, callback, finish) {
  fs.readdir(dir, function (err, files) {
    (function next(i) {
      if (i < files.length) {
        var pathname = path.join(dir, files[i]);

        fs.stat(pathname, function (err, stats) {
          if (stats.isDirectory()) {
            travel(pathname, callback, function () {
              next(i + 1);
            });
          } else {
            callback(pathname, function () {
              next(i + 1);
            });
          }
        });
      } else {
        finish && finish();
      }
    }(0));
  });
}

此处不详细介绍异步遍历函数的编排手艺,在此起彼落章节中会详细介绍这么些。总来说之大家得以看看异步编制程序依旧蛮复杂的。

小文件拷贝 小编们使用 NodeJS 内置的 fs 模块轻松完成那一个顺序如下。

您大概感兴趣的篇章:

  • 详解Node.js包的工程目录与NPM包管理器的使用
  • nodejs调用cmd命令达成复制目录
  • Node.js完结在目录中研究有些字符串及各三步跳件
  • Node.js完毕JS文件合併小工具
  • 实例详解Nodejs 保存 payload 发送过来的公文
  • Node.js静态文件服务器创新版
  • Node.js文件操作详解
  • 在Node.js中落实公文复制的办法和实例

文件拷贝 NodeJS 提供了大旨的文书操作 API,可是像文件拷贝这种高等作用就没...

var fs = require('fs');

function copy(src, dst) {
  fs.writeFileSync(dst, fs.readFileSync(src));
}

function main(argv) {
  copy(argv[0], argv[1]);
}

main(process.argv.slice(2));

如上程序接纳 fs.readFileSync 从源路线读取文件内容,并利用 fs.writeFileSync 将文件内容写入指标路径。

豆知识: process 是贰个全局变量,可透过 process.argv 获得命令行参数。由于 argv[0] 固定等于 NodeJS 施行顺序的相对路线,argv[1] 固定等于主模块的相对路线,由此首先个命令行参数从 argv[2] 这一个任务上马。

大文件拷贝 下面的顺序拷贝一些小文件没啥难点,但这种二遍性把装有文件内容都读取到内部存储器中后再一遍性写入磁盘的方法不符合拷贝大文件,内部存款和储蓄器会爆仓。对于大文件,大家只好读一些写一些,直到实现拷贝。由此上面包车型客车顺序须要更动如下。

var fs = require('fs');

function copy(src, dst) {
  fs.createReadStream(src).pipe(fs.createWriteStream(dst));
}

function main(argv) {
  copy(argv[0], argv[1]);
}

main(process.argv.slice(2));

以上程序行使 fs.createReadStream 创设了八个源文件的只读数据流,并选择fs.createWriteStream 创造了一个指标文件的只写数据流,况兼用 pipe 方法把五个数据流连接了四起。连接起来后发生的工作,说得抽象点的话,水顺着水管从三个桶流到了另四个桶。

遍历目录

遍历目录是操作文件时的二个大范围供给。比如写二个前后相继,需求找到并管理钦命目录下的兼具JS文件时,就须求遍历整个目录。

递归算法 遍历目录时相似选择递归算法,不然就麻烦编写出简洁的代码。递归算法与数学归咎法类似,通过持续缩没相当的框框来化解难题。以下示例表明了这种方法。

function factorial(n) {
  if (n === 1) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}

上面包车型地铁函数用于总括 N 的阶乘(N!)。能够见到,当 N 大于 1 时,难题简化为总括 N 乘以 N-1 的阶乘。当 N 等于 1 时,难题达到最小规模,没有要求再简化,因而一贯回到 1。

陷阱: 使用递归算法编写的代码即使轻易,但由于每递归三次就生出二次函数调用,在需求事先思考品质时,供给把递归算法调换为循环算法,以减弱函数调用次数。

遍历算法 目录是一个树状结构,在遍历时一般选择深度优先+先序遍历算法。深度优先,意味着达到三个节点后,首先随着遍历子节点并非邻居节点。先序遍历,意味着第叁遍达到了某节点即使遍历完毕,并非最后三回回到某节点才算数。由此采纳这种遍历方式时,上面那棵树的遍历顺序是 A > B > D > E > C > F。

     A
     / 
    B  C
    /   
   D  E  F

四头遍历 摸底了必备的算法后,我们可以简轻易单地促成以下目录遍历函数。

function travel(dir, callback) {
  fs.readdirSync(dir).forEach(function (file) {
    var pathname = path.join(dir, file);

    if (fs.statSync(pathname).isDirectory()) {
      travel(pathname, callback);
    } else {
      callback(pathname);
    }
  });
}

能够见到,该函数以有些目录作为遍历的源点。境遇二个子目录时,就先跟着遍历子目录。遇到贰个文本时,就把文件的绝对路线传给回调函数。回调函数得到文件路线后,就足以做各类判定和拍卖。因而一旦有以下目录:

- /home/user/
  - foo/
    x.js
  - bar/
    y.js
  z.css

运用以下代码遍历该目录时,获得的输入如下。

travel('/home/user', function (pathname) {
  console.log(pathname);
});



/home/user/foo/x.js
/home/user/bar/y.js
/home/user/z.css

异步遍历 一经读取目录或读取文件状态时采纳的是异步API,目录遍历函数完成起来会微微复杂,但原理完全同样。travel函数的异步版本如下。

function travel(dir, callback, finish) {
  fs.readdir(dir, function (err, files) {
    (function next(i) {
      if (i < files.length) {
        var pathname = path.join(dir, files[i]);

        fs.stat(pathname, function (err, stats) {
          if (stats.isDirectory()) {
            travel(pathname, callback, function () {
              next(i + 1);
            });
          } else {
            callback(pathname, function () {
              next(i + 1);
            });
          }
        });
      } else {
        finish && finish();
      }
    }(0));
  });
}

这里不详细介绍异步遍历函数的编写手艺,在三番五次章节中会详细介绍这几个。总来说之大家能够看出异步编制程序依然蛮复杂的。

您可能感兴趣的稿子:

  • node.js遍历目录的办法亲自去做

本文由计算机操作发布,转载请注明来源:js当三步跳件操作之文件拷贝与目录遍历的法子