Windowsのすべてのファイルには、「作成日時」「更新日時」「最終アクセス日時」という3つの日時に関する情報(「タイムスタンプ」と呼ばれる)が、ファイル属性として設定されている。これらのタイムスタンプ情報は、ファイルのプロパティで参照できる(具体的にはエクスプローラなどで、ファイルのアイコンを右クリックしてコンテキスト・メニューを開き、そこから[プロパティ]を選択する)。
次の画面は、実際にファイルのプロパティでタイムスタンプを確認しているところだ。
![](https://image.itmedia.co.jp/ait/articles/0510/28/dt-timestamp01.gif)
ファイルのタイムスタンプの参照方法
ファイルのタイムスタンプを参照するには、エクスプローラなどでファイルのアイコンを右クリックしてコンテキスト・メニューを開き、そこから[プロパティ]を選択して、ファイルのプロパティ・ダイアログを表示すればよい。
本稿では、プログラムでファイルおよびディレクトリのタイムスタンプを取得/設定する方法について解説する。
ファイルのタイムスタンプの取得と設定
.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:\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クラスのプロパティが利用できる。
カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル
カテゴリ:クラス・ライブラリ 処理対象:日付と時刻
使用ライブラリ:Fileクラス(System.IO名前空間)
使用ライブラリ:Directoryクラス(System.IO名前空間)
使用ライブラリ:FileInfoクラス(System.IO名前空間)
使用ライブラリ:DirectoryInfoクラス(System.IO名前空間)
使用ライブラリ:FileSystemInfoクラス(System.IO名前空間)
関連TIPS:TIPS:ファイルやディレクトリの読み取り専用属性を確認/設定/解除するには?
Copyright© Digital Advantage Corp. All Rights Reserved.