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 中記錄了時區信息,不至於在使用的過程中丟掉時區信息,出現重複時間轉換,發生時間錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章