実現したいこと
下記のいずれかを実現したいです。
- ファイルのアクセス日時を変更せずにファイルをコピーしたい。
(アクセス日時を変更したくないのはコピー元ファイルのみで、コピーした先のファイルのアクセス日時は変わっても大丈夫です。) - ファイルコピー時に変更されてしまうコピー元ファイルのアクセス日時を、後で変更前の日時に戻したい。
下記の「前提」に記載したことが実現できれば、上記以外の手段でも良いのですが。
アドバイスなどよろしくお願いいたします。
前提
C#で、Excelファイルの内容を確認・参照するプログラムを作成しているのですが、そのExcelファイルのアクセス日時に影響を与えずに処理を行う必要があります。
(後々「ユーザーにより長らくアクセスされていないファイル」を抽出する際の悪影響とならないため。)
発生している問題
VBAモジュール有無の確認等も行うため Microsoft.Office.Interop.Excel を使用してExcelファイルを開いて内容を参照しているのですが、そうするとファイルのアクセス日時が変わってしまいます。(当たり前?)
そのため、ファイルを別のフォルダにコピーし、コピーしたファイルについて操作すればよいかと思ったのですが、ファイルをコピーするとその時点でアクセス日時が更新されてしまいます。
コピーする前にアクセス日時を取得しておき、コピー後にアクセス日時を元の日時に戻せないかと思ったのですが、やはり「日時を設定した時点」がアクセス日時になってしまいます。
該当のソースコード
以下は大丈夫です。何度実行しても同じ日時がLastAccessTimeとして取得されます。
C#
1var sourceFilePath = @"C:\Users\hoge\test.xlsx"; 2var fileInfo = new FileInfo(sourceFilePath); 3fileInfo.Refresh(); 4 5var lastAccessTime = fileInfo.LastAccessTime; 6Console.WriteLine("アクセス日時:" + lastAccessTime .ToString("yyyy/MM/dd HH:mm:ss")); 7 8// 一応何かやってみる 9var lastWriteTime = fileInfo.LastWriteTime; 10Console.WriteLine("更新日時:" + lastWriteTime.ToString("yyyy/MM/dd HH:mm:ss"));
以下のようにコピー処理を行うとダメです。実行する度にLastAccessTimeとして取得される値が変わってしまいます。(CopyTo を実行した日時になっているようです。)
C#
1var sourceFilePath = @"C:\Users\hoge\test.xlsx"; 2var fileInfo = new FileInfo(sourceFilePath); 3fileInfo.Refresh(); 4 5var lastAccessTime = fileInfo.LastAccessTime; 6Console.WriteLine("アクセス日時:" + lastAccessTime.ToString("yyyy/MM/dd HH:mm:ss")); 7 8var destinationFilePath = Path.GetTempPath() + "\\" + fileInfo.Name; 9fileInfo.CopyTo(destinationFilePath, true);
コピー後に LastAccessTime の値を変更すればよいかと思ったのですが、ダメでした。「変更後アクセス日時」として設定した日時("2023/05/01 09:00:00")が表示されるのでOKかと思ったのですが、維持はされないようで、LastAccessTimeとして取得される値はやはり実行する度に変わってしまいます。(CopyTo を行わなくても変わってしまうので、LastAccessTime に値をセットした日時になるようです。)
C#
1var sourceFilePath = @"C:\Users\hoge\test.xlsx"; 2var fileInfo = new FileInfo(sourceFilePath); 3fileInfo.Refresh(); 4 5var lastAccessTime = fileInfo.LastAccessTime; 6Console.WriteLine("アクセス日時:" + lastAccessTime.ToString("yyyy/MM/dd HH:mm:ss")); 7 8var destinationFilePath = Path.GetTempPath() + "\\" + fileInfo.Name; 9fileInfo.CopyTo(destinationFilePath, true); 10 11fileInfo.LastAccessTime = DateTime.Parse("2023/05/01 09:00:00"); 12Console.WriteLine("変更後アクセス日時:" + fileInfo.LastAccessTime.ToString("yyyy/MM/dd HH:mm:ss"));
試したこと
以下いずれもNGでした。
- FileInfoのLastAccessTimeに値をセットする代わりに System.IO.File.SetLastAccessTime() により日時をセットする。
- FileInfoのCopyToに代えてFile.Copy() や FileStreamのCopyToを使う。
補足情報(FW/ツールのバージョンなど)
フレームワークは.NET 6.0ですが、.NET Framework 4.8でも結果は変わらないようです。

回答2件
あなたの回答
tips
プレビュー