はじめに
今回はファイルを作成した日、変更した日、最後に開いた日という
いわゆるタイムスタンプを基準にC#でファイルを並び替える方法の紹介です。
なお、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));
実際に使ってみると以下のような感じ。
なお、どの場合でもDateTimeを取得しているので、
Dateで日付、TimeOfDayで時刻だけを取得する事も可能です。
//作成日の日付だけを表示 Debug.Log(File.GetCreationTime(filePath).Date); //作成日の時刻だけを表示 Debug.Log(File.GetCreationTime(filePath).TimeOfDay);
ソート
タイムスタンプを使ってソートしたい場合は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}"); }
実際に使ってみると以下のような感じ。
なお、新しい順(降順)にソートしたい場合は
OrderByDescendingやThenByDescendingを使います。
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化