(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



タイムスタンプ(作成日、変更日、最後に開いた日)を基準にファイルを古い順や新しい順にソート【C#】【LINQ】


このエントリーをはてなブックマークに追加



はじめに

今回はファイルを作成した日、変更した日、最後に開いた日という

いわゆるタイムスタンプを基準にC#でファイルを並び替える方法の紹介です。

f:id:kan_kikuchi:20200121045314j:plain


なお、Unity上で動かしているので、ログの表示にDebug.Logを使っています。


タイムスタンプの取得

C#でタイムスタンプを取得したい時はFileクラスを使います。

using System.IO;//Fileクラス使うのに必要
//タイムスタンプを取得する対象のファイルへのパス
var filePath = "/Users/Hoge/Age/movie02912h53m.mp4";

//作成日を表示
Debug.Log(File.GetCreationTime(filePath));

//変更日を表示
Debug.Log(File.GetLastWriteTime(filePath));

//最後に開いた日を表示します
Debug.Log(File.GetLastAccessTime(filePath));


実際に使ってみると以下のような感じ。

f:id:kan_kikuchi:20200121043850j:plain
f:id:kan_kikuchi:20200121043859j:plain


なお、どの場合でもDateTimeを取得しているので、

Dateで日付、TimeOfDayで時刻だけを取得する事も可能です。

//作成日の日付だけを表示
Debug.Log(File.GetCreationTime(filePath).Date);
    
//作成日の時刻だけを表示
Debug.Log(File.GetCreationTime(filePath).TimeOfDay);
f:id:kan_kikuchi:20200121044306j:plain



ソート

タイムスタンプを使ってソートしたい場合はLINQを使うと簡単に実装できます。

例えば古い順(昇順)にしたい場合はOrderByを使えばいいですし、

ソートした中でさらに別の条件でソートしたい場合はThenByが使えます。

using System.IO;
using System.Linq;
//タイムスタンプを取得し、ソートするファイルが入ったディレクトリへのパス
var directoryPath = "/Users/Hoge/Age/Recordings";

//対象ファイルのパスを取得
var filePaths = Directory
  .GetFiles (directoryPath, "*", SearchOption.AllDirectories)   //ディレクトリ内の全ファイルを取得
  .Where(filePath => Path.GetFileName(filePath) != ".DS_Store") //.DS_Storeは除く
  .OrderBy(filePath => File.GetLastWriteTime(filePath).Date)    //日付順に昇順でソート
  .ThenBy(filePath => File.GetLastWriteTime(filePath).TimeOfDay)//同じ日付内で時刻順に昇順でソート
  .ToList();                                                    //List化

//ソート結果を確認。
foreach (var filePath in filePaths) {
  Debug.Log($"{File.GetLastWriteTime(filePath)} : {filePath}");
}


実際に使ってみると以下のような感じ。

f:id:kan_kikuchi:20200121044528j:plain
f:id:kan_kikuchi:20200121045314j:plain


なお、新しい順(降順)にソートしたい場合は

OrderByDescendingThenByDescendingを使います。

var filePaths = Directory
  .GetFiles (directoryPath, "*", SearchOption.AllDirectories)             //ディレクトリ内の全ファイルを取得
  .Where(filePath => Path.GetFileName(filePath) != ".DS_Store")           //.DS_Storeは除く
  .OrderByDescending(filePath => File.GetLastWriteTime(filePath).Date)    //日付順に降順でソート
  .ThenByDescending(filePath => File.GetLastWriteTime(filePath).TimeOfDay)//同じ日付内で時刻順に降順でソート
  .ToList();                                                              //List化