当前位置: 首页 > news >正文

C#/.NET 读取或修改文件的创建时间和修改时间

手工在博客中添加 Front Matter 文件头可是个相当费事儿的做法,这种事情就应该自动完成。

.NET 中提供了非常方便的修改文件创建时间的方法,使用这种方法,能够帮助自动完成一部分文件头的编写或者更新。


相关类型

.NET 中提供了两个不同的设置创建和修改时间的入口:

  • File 静态类
  • FileInfo

File 类的时间方法
▲ File 静态类的方法

FileInfo 类的时间方法
▲ FileInfo 类的方法

很明显,使用 FileInfo 类可以使用属性直接获取和赋值,用法上会比 File 方便,不过需要一个 FileInfo 的实例。

修改时间

我期待能够读取文件的创建和修改时间来获知博客文章的发布和修改时间。不过在此之前,我需要先根据 Markdown 文件元数据更新文件时间。

private void FixFileDate(FileInfo file, DateTimeOffset createdTime, DateTimeOffset modifiedTime)
{
    // 更改文件的创建时间。
    file.CreationTimeUtc = createdTime.UtcDateTime;
    // 更改文件的更新时间。
    file.LastWriteTimeUtc = modifiedTime.UtcDateTime;
    // 更改文件最近一次访问的时间。
    file.LastAccessTimeUtc = DateTimeOffset.Now.UtcDateTime;
}

至于如何获取 Markdown 文件元数据中的时间,可以使用 YamlDotNet(当然,需要自己提取 YAML 元数据头)。

读取时间

当此后需要使用文件的创建时间来更新 YAML 元数据时,只需要读取这几个属性即可。

UpdateMetaTime(file, file.CreationTimeUtc, file.LastWriteTimeUtc);

void UpdateMetaTime(FileInfo file, DateTimeOffset publishDate, DateTimeOffset date)
{
    var publishDateString =  date.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss zz");
    var dateString =  date.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss zz");
    // 省略更新 YAML 元数据。
}

关于 UTC 时间

也许你注意到以上我使用的时间类型都是 DateTimeOffset 而不是 DateTime,这是因为 DateTimeOffset 中记录了时区信息,不至于在使用的过程中丢掉时区信息,出现重复时间转换,发生时间错误。

相关文章:

  • 通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET 中 GetProcess 相关方法的性能
  • 常用输入法快速输入自定义格式的时间和日期(搜狗/QQ/手心/微软拼音)
  • 好的框架需要好的 API 设计 —— API 设计的六个原则
  • .NET/C# 使用反射注册事件
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • WPF 多线程 UI:设计一个异步加载 UI 的容器
  • .NET 命令行参数包含应用程序路径吗?
  • 分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0(使用 .NET Core 3.0 Desktop API Analyzer )
  • C# 空合并操作符(??)不可重载?其实有黑科技可以间接重载!
  • UWP 轻量级样式定义(Lightweight Styling)
  • 预编译框架,开发高性能应用 - 课程 - 微软技术暨生态大会 2018
  • 将 UWP 中 CommandBar 的展开方向改为向下展开
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 08.Android之View事件问题
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • java中具有继承关系的类及其对象初始化顺序
  • log4j2输出到kafka
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP的类修饰符与访问修饰符
  • python 学习笔记 - Queue Pipes,进程间通讯
  • SpiderData 2019年2月23日 DApp数据排行榜
  • TypeScript迭代器
  • Vue 重置组件到初始状态
  • Vue--数据传输
  • Vue小说阅读器(仿追书神器)
  • 创建一种深思熟虑的文化
  • 订阅Forge Viewer所有的事件
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 将 Measurements 和 Units 应用到物理学
  • 使用Gradle第一次构建Java程序
  • 06-01 点餐小程序前台界面搭建
  • linux 淘宝开源监控工具tsar
  • $NOIp2018$劝退记
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (力扣题库)跳跃游戏II(c++)
  • (转载)深入super,看Python如何解决钻石继承难题
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net FrameWork总结
  • .Net 代码性能 - (1)
  • .net反混淆脱壳工具de4dot的使用
  • @Autowired标签与 @Resource标签 的区别
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [Android]How to use FFmpeg to decode Android f...
  • [Asp.net mvc]国际化
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流