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 但願你能有所收穫 😁

相關文章
相關標籤/搜索