前言

在默认情况下,一个文件的创建时间修改时间是系统自己设定的,我们不能修改该的。但我们有时为了某种特殊需要,为了不让别人一眼看出文件已经给修改了,我们又需要修改文件的创建时间修改时间。那么如何修改文件夹时间,如何修改文件的创建时间,如何批量修改文件的创建时间修改时间访问时间呢?别着急,接下来就带你自己修改他们。所以,闲话不多说啦,开始写我们的代码啦~~

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

简单的搭建一下

  • 新建一个 files 目录

  • 初始化一个node项目工程

    npm init -y

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

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

因为这个库有些许特殊,分两种情况,一个是低版本Node可以直接安装,在我本机的Node13上运行则会失败。具体原因嘛,可以看看下方的链接

ps: 原因 + 解决方案

所以,在低版本的Node我们可以直接npm install @ronomon/utimes,而在版本相对较高的则需要npm i https://github.com/Jule-/utimes.git#napi-migration

这里也提一嘴,如果@ronomon/utimes安装失败的话,是因为这些原生Node拓展是需要编译的,所以我们可能需要安装windows-build-tools,即以管理员身份启动PowerShell并运行:

npm install --global windows-build-tools

安装完依赖之后就可以正式写我们的代码啦,其实这个代码相对简单,就是直接调用它的api就好了。

简单的使用一下

  • 新建一个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-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 希望你能有所收获

node实现文件属性批量修改(时间属性)的更多相关文章

  1. node实现文件属性批量修改(文件名)

    前言 书接上回,我们实现了批量修改文件的时间,但是却没有实现文件名称的批量修改,是因为我也说过,没有界面的话直接在命令行实现显得有点繁琐,所以我们就通过接口+界面的方式来实现我们这个小需求吧.所以,闲 ...

  2. 关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧

    Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的 ...

  3. PowerShell 批量修改AD属性

    环境:win 2008 R2 在管理工具中打开用于 windows powershell 的ActiveDirectory模块命令行窗口或打开命令提示符窗口输入PowerShell回车再输入impor ...

  4. VC++ 实现修改文件创建、访问、修改时间属性(转载)

    转载:http://sunnysab.blog.163.com/blog/static/18037500920134221295425/ struct _FILETIME { //结构体定义 DWOR ...

  5. jQuery匹配id 批量修改css属性

    <ul id="foreignCurrencyTree_1_ul"> <li id="foreignCurrencyTree_11_li"&g ...

  6. 使用PowerShell来修改文件访问,创建,修改时间属性

    Function Set-FileTimeStamps { Param ( [Parameter(mandatory=$true)] [string[]]$path, [datetime]$date ...

  7. VC++ 获取文件属性创建时间、修改时间和访问时间

    转载:http://blog.sina.com.cn/s/blog_66bf8d8301014ikd.html WIN32_FIND_DATA结构 关于文件的全部属性信息,总计有以下以下9 种:文件的 ...

  8. powershell小脚本--批量添加用户属性----导出登录时间

    需求1:某公司所有员工少了MAIL属性,需要批量添加.例如,用户chenyy  添加邮件属性chenyy@xxxx.com 先导出(只导出名字)备用: Get-ADUser -Filter * -Pr ...

  9. Sql批量修改帝国cms文章发布时间(需unix时间,否则会变为1970-01-01)

    在迁移网站时,有时我们需要将帝国cms文章发表时间批量修改为当前时间,在帝国cms后台→系统设置→备份与恢复数据→执行sql语句: update phome_ecms_news set newstim ...

随机推荐

  1. kali中安装漏洞靶场Vulhub(超详细)

    前言 我们都知道,在学习网络安全的过程中,搭建漏洞靶场有着至关重要的作用.复现各种漏洞,能更好的理解漏洞产生的原因,提高自己的学习能力.下面我在kali中演示如何详细安装漏洞靶场Vulhub. 什么是 ...

  2. 485通信——驱动 MX64/MX28 舵机

    背景:在使用STM32调试MX64舵机时,由于控制该舵机需要采用RS485通信协议,因此需要从单片机的串口经过一个TTL转485通信的模块再与舵机进行通信. 485通信特点: 485通信采用差分信号: ...

  3. 04 . Nginx的Rewrite重写

    Rewrite简介 # Rewrite对应URL Rewrite,即URL重写,就是把传入web的请求重定向到其他URL的过程. # 当运维遇到要重写情况时,往往是要程序员把重写规则写好后,发给你,你 ...

  4. Java实现 LeetCode 817 链表组件(暴力)

    817. 链表组件 给定一个链表(链表结点包含一个整型值)的头结点 head. 同时给定列表 G,该列表是上述链表中整型值的一个子集. 返回列表 G 中组件的个数,这里对组件的定义为:链表中一段最长连 ...

  5. Java实现 LeetCode 390 消除游戏

    390. 消除游戏 给定一个从1 到 n 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数 ...

  6. Java实现 蓝桥杯 算法训练 谁干的好事?

    试题 算法训练 谁干的好事? 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 ABCDE中num个人做了好事,truth个人说真话. A说:"我和X中有且只有一个做了好事& ...

  7. Java实现N*N矩阵旋转(360度)

    N*N矩阵旋转 Description 给你一个n*n的矩阵,你的任务是将它逆时针旋转角度d. [输入] 输入的第一个数为T,表示接下来有T组数据. 每组数据的格式如下: 第一行为两个整数n,d.1& ...

  8. Java实现字母去重

    描述 给定一个字符串S,每次操作你可以将其中任意一个字符修改成其他任意字符. 请你计算最少需要多少次操作,才能使得S中不存在两个相邻的相同字符. 输入 只包含小写字母的字符串S. 1 ≤ |S| ≤ ...

  9. Java动态规划实现最短路径问题

    问题描述 给定一个加权连通图(无向的或有向的),要求找出从每个定点到其他所有定点之间的最短路径以及最短路径的长度. 2.1 动态规划法原理简介 动态规划算法通常用于求解具有某种最优性质的问题.在这类问 ...

  10. java实现第六届蓝桥杯加法变乘法

    加法变乘法 题目描述 我们都知道:1+2+3+ - + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+-+1011+12+-+2728+29+- ...