SuiTechLog

Unity,Arduino,RaspberryPiなど、モノづくり系を気ままに書き残すブログ。

maxscript Dotnetを使って、ファイルの更新日時を任意の表示フォーマットで取得する


はじめに


maxscript の getFileModDateメソッドで、ファイルの更新日時とかを取得できますが、
もっと自由なフォーマットにしたり、スマートに取得したかったのでDotNetを使ってみました。

ファイル情報を取得


まず、ファイル情報とそこから更新日時を取得します。

local filepath = @"ファイルフルパス"
local fileInfo = (dotnetObject "System.IO.FileInfo" filepath) 
origdate = fileInfo.LastWriteTime.ToString( )


これで、origdateには、"2018/05/29 19:17:45"みたいなフォーマットで日付が入ります。

解説

fullpathには任意のファイルへのフルパスをいれてください。
これにより、fileInfoには、FileInfoクラス.aspx)が入ります。
そこから、LastWriteTimeで更新日時を取得、それを文字列にコンバートしています。

ちなみにFileInfoクラスには、CreationTimeやLastAccessTimeなど様々なファイル情報もありますので探って見ると面白いかもしれません。

さて、ここまではmascriptでできますが、ここからがやりたいこと。

表示フォーマットをすきに変換する


日付データの表示フォーマットを自由に変換します。

--日付クラスを呼び出す
local dateTime = (dotNetClass "System.DateTime")    
--日付クラスに先ほど生成した日付文字列を読み込ませる
sdate = dateTime.Parse(origdate)
--取得した文字列を一定のルールに従って再取得
date =  (sdate.ToString ("yyyy/MM/dd(ddd) HH:mm:ss" ))

これによりdateには"2018/05/29(火) 19:17:45"のようなフォーマットで日付がはいることになります。

解説

(dotNetClass "System.DateTime") これは、DateTIme構造体.aspx)で、日付に関する様々な処理を行うことができます。

dateTime.Parse(origdate) 次にこれを使って先ほど生成した更新日時の文字列をパース(読み込んで)内部的に分解しています。

そして、sdate.ToString ("yyyy/MM/dd(ddd) HH:mm:ss" ) ここで任意のフォーマットにして返しています。

このToStringに関してはここにマニュアル.aspx)がありますのでご覧ください。

見ていただくと分かる通り、渡す文字列に応じて自由なフォーマットに変換することができます。
ちなみに今回は、yyyyが年、MMが月、ddが日付、dddが曜日を表しています。

好きな順番にしたり、必要がなければ抜いたりすることができますし、まだまだ色々な文字列が用意されているので、試してみてください。

今回のスクリプト全体

fn getLastWriteTime in_filepath =
(
    --ファイル情報クラスを用意しフルパスを渡す。
    local fileInfo = (dotnetObject "System.IO.FileInfo" in_filepath)

    --ファイル情報から更新時間を文字列で取り出す
    origdate = fileInfo.LastWriteTime.ToString()
    
    --日付クラスを呼び出す
    local dateTime = (dotNetClass "System.DateTime")    
    
    --日付クラスに先ほど生成した更新時間を読み込ませる
    sdate = dateTime.Parse(origdate)
    
    --取得した文字列を一定のルールに従って再取得
    date =  (sdate.ToString ("MM/yyyy/dd(ddd) HH:mm:ss" ))
        
    return date
)

--関数呼び出し
getLastWriteTime(@"ファイルへのフルパス")