在默認狀況下,一個文件的建立時間
和修改時間
是系統本身設定的,咱們不能修改該的。但咱們有時爲了某種特殊須要,爲了避免讓別人一眼看出文件已經給修改了,咱們又須要修改文件的建立時間
和修改時間
。那麼如何修改文件夾時間,如何修改文件的建立時間,如何批量修改文件的建立時間
、修改時間
和訪問時間
呢?彆着急,接下來就帶你本身修改他們。因此,閒話很少說啦,開始寫咱們的代碼啦~~node
ps:小工具推薦NewFileTime,以上簡述摘抄於
NewFileTime
git
新建一個 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-migration
啦bash
這裏也提一嘴,若是@ronomon/utimes
安裝失敗的話,是由於這些原生Node
拓展是須要編譯的,因此咱們可能須要安裝windows-build-tools
,即以管理員身份啓動PowerShell
並運行:app
npm install --global windows-build-tools
安裝完依賴以後就能夠正式寫咱們的代碼啦,其實這個代碼相對簡單,就是直接調用它的api
就行了。async
新建一個test-files
文件夾
在test-files
文件夾新建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
,是都發現日期發生了改變呢?
看到這裏你覺得是否是寫完了,其實也差很少了 😝,不過我固然不會讓你收穫這麼少的,至少咱們能夠看看咱們這個最最最簡單的例子的缺點,好比代碼沒有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-promisify
、thenify
、bluebird.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") ); } })();
得出結果
這樣子就遞歸了咱們全部的文件夾跟子文件了進行修改了,原本想着在加載名字修改的,但苦於- -沒有界面,篇幅也過長,就留着過幾天再寫了。
感謝各位觀衆老爺的觀看 O(∩_∩)O 但願你能有所收穫 😁