ファイルの「更新日時(タイムスタンプ)」は、バックアップ処理の判定や、古いログファイルの自動削除、キャッシュの鮮度管理などで重要な情報です。
System.IO.FileInfo クラス(または File クラスの静的メソッド)を使用することで、これらの日時情報を取得するだけでなく、任意の日時に書き換えることも可能です。
実装サンプル:古いファイルのシミュレーション
以下のコードでは、ファイル削除バッチのテストを行うために、テスト用ファイルの更新日時を「意図的に1年前の日付」に書き換える処理を実装しています。
サンプルコード
using System;
using System.IO;
public class Program
{
public static void Main()
{
// 操作対象のファイル
string filePath = "test_cleanup_target.dat";
// 1. 準備:ファイルを新規作成(この時点の日時は「現在」になる)
if (!File.Exists(filePath))
{
File.WriteAllText(filePath, "Old data content...");
}
// FileInfoインスタンスの生成
var fileInfo = new FileInfo(filePath);
// 変更前の日時を表示
Console.WriteLine($"[変更前] 更新日時: {fileInfo.LastWriteTime}");
Console.WriteLine($"[変更前] 作成日時: {fileInfo.CreationTime}");
Console.WriteLine("--- タイムスタンプを操作します ---");
// 2. 更新日時と作成日時を「1年前」に変更する
// テストなどで「古いファイル」として扱わせたい場合に有効
DateTime oldDate = DateTime.Now.AddYears(-1);
// プロパティに値を代入するだけで、即座にファイルシステムに反映されます
fileInfo.LastWriteTime = oldDate;
fileInfo.CreationTime = oldDate; // ついでに作成日時も合わせる
// 3. 変更結果の確認
// 同じインスタンスのプロパティを再読込するには Refresh() が必要
fileInfo.Refresh();
Console.WriteLine($"[変更後] 更新日時: {fileInfo.LastWriteTime}");
Console.WriteLine($"[変更後] 作成日時: {fileInfo.CreationTime}");
// (参考) Fileクラスの静的メソッドを使う場合
// File.SetLastWriteTime(filePath, DateTime.Now);
}
}
実行結果(例:現在が2025/10/01の場合)
[変更前] 更新日時: 2025/10/01 10:00:00
[変更前] 作成日時: 2025/10/01 10:00:00
--- タイムスタンプを操作します ---
[変更後] 更新日時: 2024/10/01 10:00:00
[変更後] 作成日時: 2024/10/01 10:00:00
解説と技術的なポイント
1. 取得・設定できる日時の種類
FileInfo クラスには主に3つの日時プロパティがあります。いずれも DateTime 型で、取得・設定(書き込み)の両方が可能です。
LastWriteTime: ファイルの内容が最後に書き換えられた日時(更新日時)。最も頻繁に使用されます。CreationTime: ファイルが作成された日時。LastAccessTime: ファイルに最後にアクセス(読み取りなど)があった日時。
2. FileInfo.Refresh() メソッド
FileInfo オブジェクトは、最初にプロパティにアクセスした時点の情報をキャッシュ(保持)します。 そのため、外部要因や自身の操作によってディスク上のファイル情報が変化した後、同じ FileInfo インスタンスで最新の値を取得したい場合は、必ず Refresh() メソッドを呼び出してキャッシュを更新する必要があります。 ※サンプルコード内で変更後に正しい値が表示されるのは、このメソッドのおかげです。
3. 静的メソッドとの使い分け
特定のファイルを1回だけ操作する場合は、インスタンスを作らずに済む File クラスの静的メソッドが便利です。
File.GetLastWriteTime(path)File.SetLastWriteTime(path, dateTime)
大量のファイルを連続して処理する場合や、日時以外の属性(サイズなど)も併せて扱いたい場合は、FileInfo インスタンスを作成する方が効率的です。
