node实现文件属性批量修改(时间属性)

前言

在默认状况下,一个文件的建立时间修改时间是系统本身设定的,咱们不能修改该的。但咱们有时为了某种特殊须要,为了避免让别人一眼看出文件已经给修改了,咱们又须要修改文件的建立时间修改时间。那么如何修改文件夹时间,如何修改文件的建立时间,如何批量修改文件的建立时间修改时间访问时间呢?别着急,接下来就带你本身修改他们。因此,闲话很少说啦,开始写咱们的代码啦~~node

ps:小工具推荐NewFileTime,以上简述摘抄于NewFileTimegit

简单的搭建一下

  • 新建一个 files 目录es6

  • 初始化一个node项目工程github

    npm init -y

看到这里你会发现,其实我没有安装依赖,是由于原生的库有这个自带的功能吗?说是也行,说不是也行。原生的utimes目前支持修改文件的修改时间访问时间,不支持修改文件的建立时间,因此咱们须要借助一个第三方库来修改。npm

为何不直接安装这个第三方库呢?

由于这个库有些许特殊,分两种状况,一个是低版本Node能够直接安装,在我本机的Node13上运行则会失败。具体缘由嘛,能够看看下方的连接windows

ps: 缘由 + 解决方案api

因此,在低版本的Node咱们能够直接npm install @ronomon/utimes,而在版本相对较高的则须要npm i https://github.com/Jule-/utimes.git#napi-migrationbash

这里也提一嘴,若是@ronomon/utimes安装失败的话,是由于这些原生Node拓展是须要编译的,因此咱们可能须要安装windows-build-tools,即以管理员身份启动PowerShell并运行:app

npm install --global windows-build-tools

安装完依赖以后就能够正式写咱们的代码啦,其实这个代码相对简单,就是直接调用它的api就行了。async

简单的使用一下

  • 新建一个test-files文件夹

  • test-files文件夹新建1.txt文件供咱们测试

    1.txt文件

  • 编写以下代码:

    // 导入 utimes
    const { utimes } = require("@ronomon/utimes");
    utimes(
      "./test-files/1.txt",
      // 建立时间
      +new Date("2010/01/01"),
      // 修改时间
      +new Date("2010/01/02"),
      // 访问时间
      +new Date("2010/01/03"),
      (err) => {
        //  修改为功的回调
        console.log(`success`);
      }
    );
  • 运行代码,node app.js,是都发现日期发生了改变呢?

    1.txt文件

看到这里你觉得是否是写完了,其实也差很少了 😝,不过我固然不会让你收获这么少的,至少咱们能够看看咱们这个最最最简单的例子的缺点,好比代码没有Promise化,那么咱们就封装一下utimes

/**
 *
 * @param {String} path => 路径
 * @param {Number} btime => 建立时间,不传即不修改
 * @param {Number} mtime => 修改时间,不传即不修改
 * @param {Number} atime => 访问时间,不传即不修改
 */
const utimesPromise = (path, btime, mtime, atime) => {
  return new Promise((resolve, reject) => {
    utimes(path, btime, mtime, atime, (err) => (err ? reject(err) : resolve()));
  });
};

固然- -,由于咱们使用的是Node,因此咱们不须要常规的用new Promise封装,能够直接使用内置的util这个工具中的promisify方法封装便可

util.promisify 是在 node.js 8.x 版本中新增的一个工具,用于将老式的 Error first callback 转换为 Promise 对象,让老项目改造变得更为轻松。在官方推出这个工具以前,民间已经有不少相似的工具了,好比 es6-promisifythenifybluebird.promisify。以及不少其余优秀的工具,都是实现了这样的功能,帮助咱们在处理老项目的时候,没必要费神将各类代码使用 Promise 再从新实现一遍。

因此,咱们的封装又变得更加简单了,代码以下:

const { promisify } = require("util");
const utimesPromise = promisify(utimes);

以前的代码就能够改写成以前咱们那样的自执行Async Function了,代码以下:

// ...
(async () => {
  await utimesPromise(
    "./test-files/1.txt",
    // 建立事件
    +new Date("2010/01/01"),
    // 修改时间
    +new Date("2010/01/02"),
    // 访问时间
    +new Date("2010/01/03")
  );
})();

写到这里,你会发现其实咱们根本没有作批量修改,是由于有了以前的经验,咱们能够直接经过glob这个工具获取全部的路径,根本不要咱们操心,写起来也十分简单,因此我打算最后再来写

  • 安装glob

    npm i glob -S
  • 多建几个文件用于测试咱们的代码

    建立文件

    得出下面列表:

    建立文件

  • 修改咱们的代码:

    const { utimes } = require("@ronomon/utimes");
    const glob = require("glob");
    const { promisify } = require("util");
    
    /**
     *
     * @param {String} path => 路径
     * @param {Number} btime => 建立时间,不传即不修改
     * @param {Number} mtime => 修改时间,不传即不修改
     * @param {Number} atime => 访问时间,不传即不修改
     */
    const utimesPromise = promisify(utimes);
    
    (async () => {
      const paths = glob.sync("./test-files/**");
      const len = paths.length;
      for (let i = 0; i < len; i++) {
        await utimesPromise(
          paths[i],
          +new Date("2010/01/01"),
          +new Date("2010/01/02"),
          +new Date("2010/01/04")
        );
      }
    })();
  • 得出结果

    运行结果

这样子就递归了咱们全部的文件夹跟子文件了进行修改了,原本想着在加载名字修改的,但苦于- -没有界面,篇幅也过长,就留着过几天再写了。

gitee 地址,github 地址

最后

感谢各位观众老爷的观看 O(∩_∩)O 但愿你能有所收获 😁

相关文章
相关标签/搜索