特定のフォルダ以下の、特定の拡張子のファイルを拾い上げて、CSVでファイル名と更新時刻をリスト化したい。わざわざ専用プログラム作らなくても、もっと楽な手段あるじゃろ・・・とか思いつつも、ちょうどいい機会なので、Goの勉強がてら作ってみることにした。
docinfo.exe -walkdir ./sample -extension doc,xls,xlsx,xlsm,pdf > list.csv
go buildして作ったexeを、こんな感じで使いたい。-walkdirで指定したフォルダ以下の、-extensionで指定した拡張子のファイルを検索して、そいつの更新日時を一覧でCSV出力する。
かばん.doc,2018-04-13 サーバル.pdf,2018-07-22 ラッキービースト.xlsx,2019-04-11
出力結果はこうなる。もちろん、txtとか対象外のファイルは出力されない。
2期?知らない子ですねぇ・・・
イカソース。
上記のアレを作るにあたっていろいろ覚えたことをメモしとく。
コマンドラインのフラグ解析
今まで「os.Args」を使ってプログラムに渡された引数を直で拾ってきてたのだけれども、パーサーあった方が楽だよね。なんかねえかな、と調べたところflagパッケージとかいう便利そうなのが普通にあったので使ってみた。flag.String()を使えば、オプションで指定した文字列をいい感じに取ってこれた。string以外にも、intとかboolとかいろんな形式で取れるみたいね。そのうち使ってみよう。
リストから特定の要素を検索
アプリの引数で渡した拡張子をSplitで分解&配列化して、配列の中に該当する拡張子があったらファイルの更新日時を取得、ってな感じの処理を組んでる。しかし、配列の中から要素を検索するのに、Pythonでいうところの「in」みたいに一発で探せるやつが無いっぽい?
仕方なくググって出てきた情報をもとに、配列内から要素を探すcontains関数を実装した。文字列配列をfor-rangeでぶん回して、一致してる要素があればtrue返すってな作りにするのが安定っぽい。ちなみにrangeが返してくる1個目の値はインデックスなので、アンダーバーで無視すりゃおっけ。
ファイルの更新日時取得
ちょっと調べたところによるとGoはファイルの情報を取得しようとすると、OSに依存して手段が変わるっぽくて非常にめんどくさそうだ。ということで早々に諦めて、外人さんが作ってた「いろんなプラットフォームに対応したファイル情報取得するライブラリ」を使わせてもらった。感謝感激雨嵐。しかしなんかGitHubに書いてあったインストール方法だとコケたので、めんどくなってローカルにソース一式落として読み込んでるのは内緒な。
使い方としては至極簡単で、times.Stat(ファイルパス)で戻ってきたファイル情報から、ChangeTime()で更新日時を取得。そいつで取得したデータはtime.Timeなので、あとはいい感じに料理してやればOK。