C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ミリ秒まで更新日時を取得したい

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■90751 / inTopicNo.1)  ミリ秒まで更新日時を取得したい
  
□投稿者/ SUV (1回)-(2019/04/17(Wed) 20:46:00)

分類:[.NET 全般] 

ミリ秒まで更新日時を取得したいのですが

https://dobon.net/vb/dotnet/file/filetimestamp.html

このサイトのコードだと秒までしか取得することができません。

どのようにすればミリ秒まで取得することができますか?


引用返信 編集キー/
■90752 / inTopicNo.2)  Re[1]: ミリ秒まで更新日時を取得したい
□投稿者/ Hongliang (782回)-(2019/04/17(Wed) 20:52:11)
ファイルシステムがFAT32であれば確か2秒単位だったはずですが、NTFSであれば問題なくミリ秒(より下)まで取得できるはずです。
単に表示していないだけではないでしょうか。
ミリ秒まで表示させたい場合は例えば
Dim time As DateTime = System.IO.File.GetLastAccessTime("C:\test.txt")
Console.WriteLine("yyyy/MM/dd HH:mm:ss.fff", time)
のようにします。
引用返信 編集キー/
■90753 / inTopicNo.3)  Re[1]: ミリ秒まで更新日時を取得したい
□投稿者/ 魔界の仮面弁士 (2151回)-(2019/04/17(Wed) 21:10:43)
No90751 (SUV さん) に返信
> ミリ秒まで更新日時を取得したいのですが

日付の分解能は、対象のファイルシステムによって異なります。
対象のファイルシステムは何ですか?

FAT32 … 作成日時:10ミリ秒、最終更新日時:2秒、最終アクセス日時:1日
NTFS  … 作成日時:100ナノ秒、最終更新日時:100ナノ秒、最終アクセス日時:100ナノ秒、POSIX変更日時:100ナノ秒
exFAT … 作成日時:10ミリ秒、最終更新日時:10ミリ秒、最終アクセス日時:10ミリ秒


> https://dobon.net/vb/dotnet/file/filetimestamp.html
> このサイトのコードだと秒までしか取得することができません。

当方では秒未満まで問題無く出力されましたが…。

'
' Visual Basic
'
Imports System
Imports System.IO
Imports System.Globalization
Module Module1
 Sub Main()
  Dim c As CultureInfo = CultureInfo.InvariantCulture
  Dim f As String = "C:\Windows\System32\cmd.exe"
  Dim d As Date = File.GetLastWriteTimeUtc(f)
  Dim s As String = d.ToString("yyyy\/MM\/dd HH\:mm\:ss\.fffffff", c)
  Console.WriteLine(s)
 End Sub
End Module

//
// C#
//
using System;
using System.IO;
using System.Globalization;
class Program
{
 static void Main(string[] args)
 {
  var c = CultureInfo.InvariantCulture;
  var f = @"C:\Windows\System32\cmd.exe";
  var d = File.GetLastWriteTimeUtc(f);
  var s = d.ToString(@"yyyy\/MM\/dd HH\:mm\:ss\.fffffff", c);
  Console.WriteLine(s);
 }
}
引用返信 編集キー/
■90754 / inTopicNo.4)  Re[2]: ミリ秒まで更新日時を取得したい
□投稿者/ 魔界の仮面弁士 (2152回)-(2019/04/17(Wed) 21:18:03)
No90752 (Hongliang さん) に返信
> Console.WriteLine("yyyy/MM/dd HH:mm:ss.fff", time)

それだと常に "yyyy/MM/dd HH:mm:ss.fff" と出力されてしまいますね。(^^;

恐らくは、
 Console.WriteLine("{0:yyyy/MM/dd HH:mm:ss.fff}", time)
と書くつもりだったのでしょうけれども。

同様の処理を
 Console.WriteLine(time.ToString("yyyy/MM/dd HH:mm:ss.fff"))
 Console.WriteLine(String.Format("{0:yyyy/MM/dd HH:mm:ss.fff}", time))
 Console.WriteLine($"{time:yyyy/MM/dd HH:mm:ss.fff}") 'VB2015 以降
などと書くこともできますが、こうした方法だと、OS 設定が和暦になっていた場合に
2019/04/17 12:34:56.789 ではなく
31/04/17 12:34:56.789 と出力されるのでご注意ください。

# 最近は令和検証の関係で、一時的に和暦設定にするエンドユーザーさんがちらほら…。
引用返信 編集キー/
■90762 / inTopicNo.5)  Re[3]: ミリ秒まで更新日時を取得したい
□投稿者/ SUV (2回)-(2019/04/18(Thu) 11:38:13)
ありがとうございます。

色々と試してみたのですが、
いま、手元にWin10のPCが3台、Win7のPCが1台あります。
いずれもNTFSでドライブをフォーマットしてあります。
そして、


Win10あるいは7上で新規作成したファイルを、
その作成したPCを使って更新日時を取得すると
正常にミリ秒まで取得することができます。

しかし、そのファイルを
DropboxあるいはexFATでフォーマットしたUSBメモリで
それらのPC間でデータのやりとりすると
ミリ秒の情報がゼロになってしまうことに気が付きました。
NTFSでフォーマットした外付けドライブの場合には削除されません。
また、Win10の場合のみこの現象は起き、
Win7から別のWin10 PCにコピーした場合にはこの現象は起きません。

どれか特定のWin10のPCでだけ起きるのではなく、
いずれのWin10 PCでも起きるので、OSがバグっているというわけではないようです。

更に、おかしなことにOS標準の「送る→zip圧縮」機能を使って
圧縮したファイルを別のPCにコピーし、
解凍した場合でもその中のファイルのミリ秒が削除されてしまいます。
OS標準ではないWinRARというソフトでZIP圧縮した場合には
ミリ秒は保存されていました。

どうも、これはプログラムというよりは
Windows10の仕様のように思います。

このようなトラブルが既に報告されているのではないかと思い
検索をかけてみましたが情報は見つかりませんでした。

一体、なぜこのようなことが起きるかご存じでしょうか?




引用返信 編集キー/
■90763 / inTopicNo.6)  Re[4]: ミリ秒まで更新日時を取得したい
□投稿者/ Azulean (1053回)-(2019/04/18(Thu) 12:19:05)
部分的に。

No90762 (SUV さん) に返信
> 更に、おかしなことにOS標準の「送る→zip圧縮」機能を使って
> 圧縮したファイルを別のPCにコピーし、
> 解凍した場合でもその中のファイルのミリ秒が削除されてしまいます。
> OS標準ではないWinRARというソフトでZIP圧縮した場合には
> ミリ秒は保存されていました。

ZIP の標準的なヘッダーだけに対応した場合、時刻は 2 秒精度となり、さらに拡張ヘッダーをカバーすることで NTFS の精度になるようなので、圧縮と解凍の両方のソフトが対応していなければなりません。
よって、「おかしなこと」ではなく、ソフトの仕様次第です。

> このようなトラブルが既に報告されているのではないかと思い
> 検索をかけてみましたが情報は見つかりませんでした。

トラブルと思うかどうかは主観によります。
ミリ秒単位が失われて困ると思う人は少数派でしょうし、不具合ではなく、仕様の部分も多いのでまとめられていないだけかと思います。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ