Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Go言語でファイルの変更日時を取得する。

More than 1 year has passed since last update.

はじめに

ファイルの一覧を標準出力するときに、ファイルの変更日時を見てfilterしたいときがあって調べました。

ファイルに関する日時

statコマンドでファイルを確認すると、以下の3つの日時を保持しています。Birthという項目もあるのですが-になっています。カーネルがxstat()を提供しているかに依存するそうです。なので、私の環境では見れないみたいです。

  • Access: 2018-07-16 14:39:26.824920847 +0900
  • Modify: 2018-07-17 09:47:15.038632561 +0900
  • Change: 2018-07-18 21:07:34.324530860 +0900

Access

Accessは最後に利用した日時です。
以下で更新されます。

  • エディタで開く

Modify

Modifyは最後に修正した日時です。
以下で更新されます。

  • エディタで書き込み
  • リダイレクトによる書き込み

Change

Changeは最後に変更した日時です。
以下で更新されます。

  • エディタで書き込み
  • リダイレクトによる書き込み
  • ファイル名の変更(ファイルの移動)

Goでファイルの日時を取得する

ファイルの情報はtype FileInfo interfaceで、下記の値を取得できます。

メソッド名 概要
Name() ファイル名
Size() ファイルサイズ
Mode() 読み込み、書き込み、実行
ModTime() 修正日時
IsDir() ディレクトリかどうか
Sys() 基礎情報

見て分かるとおり、Modifyしか取得できません。
AccessとChangeを取得するには、Sys()から取らなければなりません。
まず、Sys()がinterfaceなのでsyscall.Stat_tにキャストします。
そして、LinuxならAtime,CtimeというTimespec構造体から値を取り出します。
MacOSならAtimespec,Ctimespecらしいです。手元にMacOSがないため検証はしていません。
Nano()でナノ秒で値が返ってきます。

if internalStat, ok := fileInfo.Sys().(*syscall.Stat_t); ok {
  fmt.Printf("Access: %v\n", internalStat.Atim.Nano())
  fmt.Printf("Change: %v\n", internalStat.Ctim.Nano())
}
tayusa
2年目
theport
ポート株式会社 PORT INC.は、「世界中に、アタリマエとシアワセを。」をミッションに、新しい時代の1ページを創る会社です。【PORTもくもく会】https://freestyle-mokumoku.connpass.com/
https://www.theport.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away