.NET TIPS

ファイルやディレクトリのタイムスタンプを取得/設定するには?

デジタルアドバンテージ 一色 政彦
2005/10/28

 Windowsのすべてのファイルには、「作成日時」「更新日時」「最終アクセス日時」という3つの日時に関する情報(「タイムスタンプ」と呼ばれる)が、ファイル属性として設定されている。これらのタイムスタンプ情報は、ファイルのプロパティで参照できる(具体的にはエクスプローラなどで、ファイルのアイコンを右クリックしてコンテキスト・メニューを開き、そこから[プロパティ]を選択する)。

 次の画面は、実際にファイルのプロパティでタイムスタンプを確認しているところだ。

ファイルのタイムスタンプの参照方法
ファイルのタイムスタンプを参照するには、エクスプローラなどでファイルのアイコンを右クリックしてコンテキスト・メニューを開き、そこから[プロパティ]を選択して、ファイルのプロパティ・ダイアログを表示すればよい。

 本稿では、プログラムでファイルおよびディレクトリのタイムスタンプを取得/設定する方法について解説する。

ファイルのタイムスタンプの取得と設定

 .NETのプログラムからファイルのタイムスタンプを取得したり、設定したりするには、Fileクラス(System.IO名前空間)の静的メソッドである以下のメソッドを使えばよい。

  • 【取得】作成日時:GetCreationTimeメソッド
  • 【取得】更新日時:GetLastWriteTimeメソッド
  • 【取得】最終アクセス日時:GetLastAccessTimeメソッド
  • 【設定】作成日時:SetCreationTimeメソッド
  • 【設定】更新日時:SetLastWriteTimeメソッド
  • 【設定】最終アクセス日時:SetLastAccessTimeメソッド

 取得メソッドでは、パラメータにファイルのパスを文字列で指定する。戻り値としてDateTime型のオブジェクト(=日時情報)が返される。

 設定メソッドでは、第1パラメータにファイル・パスの文字列を、第2パラメータにDateTime型のオブジェクトを設定する。戻り値はない。

ディレクトリのタイムスタンプの取得と設定

 ディレクトリのタイムスタンプも同じようにして設定できるが、ファイルの場合と異なるのは使用するクラスがDirectoryクラス(System.IO名前空間)になることである。メソッドのシグネチャは、以下のとおりまったく同じだ。

  • 【取得】作成日時:GetCreationTimeメソッド
  • 【取得】更新日時: GetLastWriteTimeメソッド
  • 【取得】最終アクセス日時:GetLastAccessTimeメソッド
  • 【設定】作成日時:SetCreationTimeメソッド
  • 【設定】更新日時:SetLastWriteTimeメソッド
  • 【設定】最終アクセス日時:SetLastAccessTimeメソッド

ファイルのタイムスタンプの取得と設定(第2の方法)

 Fileクラスのメソッドはすべて静的メソッドのため、同じファイルに対して「作成」「コピー」「削除」「移動」「開く」などの操作を繰り返し行うようなケースでは効率が悪い。このためクラス・ライブラリには、特定のファイルを指定してインスタンスを作成し、操作できるFileInfoクラス(System.IO名前空間)が用意されている。

 このFileInfoクラスを使用すれば、以下のプロパティを利用してファイルのタイムスタンプを取得/設定できる。

  • 【取得/設定】作成日時:CreationTimeプロパティ
  • 【取得/設定】更新日時:LastWriteTimeプロパティ
  • 【取得/設定】最終アクセス日時:LastAccessTimeプロパティ

 いずれのプロパティもDateTime型である。なおFileInfoクラスはFileSystemInfoクラス(System.IO名前空間)の派生クラスであり、上記のプロパティ群は実際には基本クラスのFileSystemInfoクラスで実装されている。

ディレクトリのタイムスタンプの取得と設定(第2の方法)

 ディレクトリについても、FileInfoクラスの場合と同じように、DirectoryInfoクラス(System.IO名前空間)が用意されている。DirectoryInfoクラスもFileSystemInfoクラスの派生クラスであるため、上記のFileInfoクラスとまったく同じ「CreationTimeプロパティ」「LastWriteTimeプロパティ」「LastAccessTimeプロパティ」が使用できる。

タイムスタンプのサンプル・プログラム

 上記のメソッドおよびプロパティを活用している例が、次のサンプル・プログラムである。このサンプルでは、最初にファイルの「作成日時」「更新日時」「最終アクセス日時」を設定/取得し、次にディレクトリの「作成日時」「更新日時」「最終アクセス日時」を設定/取得する。

using System;
using System.IO;

namespace ConsoleApplication1
{
  class Class1
  {
    [STAThread]
    static void Main(string[] args)
    {
      DateTime ctCreate = new DateTime(2005, 1, 1);
      DateTime ctWrite = new DateTime(2005, 2, 1);
      DateTime ctAccess = new DateTime(2005, 3, 1);

      string filepath = @"C:\test\シャボン.bmp";
      string dirpath = @"C:\test";

      File.SetCreationTime(filepath, ctCreate);
      File.SetLastWriteTime(filepath, ctWrite);
      File.SetLastAccessTime(filepath, ctAccess);

      Console.WriteLine(File.GetCreationTime(filepath));
      Console.WriteLine(File.GetLastWriteTime(filepath));
      Console.WriteLine(File.GetLastAccessTime(filepath));

      DirectoryInfo di = new DirectoryInfo(dirpath);
      di.CreationTime = ctCreate;
      di.LastWriteTime = ctWrite;
      di.LastAccessTime = ctAccess;

      Console.WriteLine(di.CreationTime);
      Console.WriteLine(di.LastWriteTime);
      Console.WriteLine(di.LastAccessTime);

      Console.ReadLine();
    }
  }
}
Imports System.IO
Imports System.Reflection


Module Module1

  Sub Main()
    Dim ctCreate As New DateTime(2005, 1, 1)
    Dim ctWrite As New DateTime(2005, 2, 1)
    Dim ctAccess As New DateTime(2005, 3, 1)

    Dim filepath As String = "C:\test\シャボン.bmp"
    Dim dirpath As String = "C:\test"

    File.SetCreationTime(filepath, ctCreate)
    File.SetLastWriteTime(filepath, ctWrite)
    File.SetLastAccessTime(filepath, ctAccess)

    Console.WriteLine(File.GetCreationTime(filepath))
    Console.WriteLine(File.GetLastWriteTime(filepath))
    Console.WriteLine(File.GetLastAccessTime(filepath))

    Dim di As New DirectoryInfo(dirpath)
    di.CreationTime = ctCreate
    di.LastWriteTime = ctWrite
    di.LastAccessTime = ctAccess

    Console.WriteLine(di.CreationTime)
    Console.WriteLine(di.LastWriteTime)
    Console.WriteLine(di.LastAccessTime)

    Console.ReadLine()
  End Sub

End Module
タイムスタンプのサンプル・プログラム(上:C#、下:VB.NET)

 なお、このサンプル・プログラムはディレクトリ「C:\test」とファイル「C:\test\シャボン.bmp」が存在することを前提としている。

タイムスタンプ設定時の注意点

 ファイルのタイムスタンプは、ファイルが「使用中」もしくは「読み取り専用」のときには設定できない。

 読み取り専用のファイルにもタイムスタンプを設定したい場合には、いったん読み取り専用を解除してからタイムスタンプを設定するとよい。これを行う方法は、「TIPS:ファイルやディレクトリの読み取り専用属性を確認/設定/解除するには?」を参考にしてほしい。

 また、以上のタイムスタンプの日時設定は、ローカル環境で設定されているローカル時間に基づいて取得/設定されるが、.NET Framework 1.1以降のクラス・ライブラリでは、UTC(Coordinated Universal Time:協定世界時刻)時間に基づいて取得/設定するためのメソッドが追加されている(.NET Framework 1.0にはない)。

 UTC時間によりタイムスタンプを取得/設定するには、以上のすべてのメソッドやプロパティの名前の最後に「Utc」を付けるだけである。具体的には以下のようなメソッドとプロパティになる。

  • File.GetCreationTimeUtcメソッド
  • File.GetLastWriteTimeUtcメソッド
  • File.GetLastAccessTimeUtcメソッド
  • File.SetCreationTimeUtcメソッド
  • File.SetLastWriteTimeUtcメソッド
  • File.SetLastAccessTimeUtcメソッド
  • Directory.GetCreationTimeUtcメソッド
  • Directory.GetLastWriteTimeUtcメソッド
  • Directory.GetLastAccessTimeUtcメソッド
  • Directory.SetCreationTimeUtcメソッド
  • Directory.SetLastWriteTimeUtcメソッド
  • Directory.SetLastAccessTimeUtcメソッド
  • FileSystemInfo.CreationTimeUtcプロパティ
  • FileSystemInfo.LastWriteTimeUtcプロパティ
  • FileSystemInfo.LastAccessTimeUtcプロパティ

 先ほども述べたように、FileクラスとDirectoryクラスは、FileSystemInfoクラスの派生クラスなので、いずれのクラスも上記のFileSystemInfoクラスのプロパティが利用できる。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル
カテゴリ:クラス・ライブラリ 処理対象:日付と時刻
使用ライブラリ:Fileクラス(System.IO名前空間)
使用ライブラリ:Directoryクラス(System.IO名前空間)
使用ライブラリ:FileInfoクラス(System.IO名前空間)
使用ライブラリ:DirectoryInfoクラス(System.IO名前空間)
使用ライブラリ:FileSystemInfoクラス(System.IO名前空間)
関連TIPS:TIPS:ファイルやディレクトリの読み取り専用属性を確認/設定/解除するには?
 
この記事と関連性の高い別の.NET TIPS
ファイルやディレクトリの一覧を取得するには?
ファイルやディレクトリのサイズを取得するには?
UTC(世界協定時)を取得するには?
ファイルをコピー/削除/リネーム/移動するには?
ファイルやディレクトリの作成/変更/削除を監視するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH