如何从很长的路径获取文件的创建日期时间?
How to get creation DateTime of file from very long path?
我的文件路径很长,所以只能使用 SafeFileHandle
.
来处理
想要获取创建日期时间。
当尝试获得 millies 然后在 DateTime
中转换时,它会减少 1600 年。
代码:
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern bool GetFileTime(SafeFileHandle hFile, ref long lpCreationTime, ref long lpLastAccessTime, ref long lpLastWriteTime);
void fnc(String file){
var filePath = @"\?\" + file;
var fileObj = CreateFile(filePath, Constants.SafeFile.GENERIC_READ, 0, IntPtr.Zero, Constants.SafeFile.OPEN_EXISTING, 0, IntPtr.Zero);
long millies = 0, l1 = 0, l2 = 0;
if(GetFileTime(fileObj, ref millies, ref l1, ref l2))
{
DateTime creationTime = new DateTime(millies, DateTimeKind.Local);
以上creationTime
少了1600年。它不是 2019 年,而是 0419。
然后我不得不这样做
DateTime creationTime = new DateTime(millies, DateTimeKind.Local).AddYears(1600);
}
}
上面creationTime
是正确的,因为我加了1600年。
是什么让日期少了 1600 年?
我做错了什么吗?
这完全是处理文件时间时设计的。
返回文件时间的基础是 1601 年 1 月 1 日的计数器:
A file time is a 64-bit value that represents the number of
100-nanosecond intervals that have elapsed since 12:00 A.M. January 1,
1601 Coordinated Universal Time (UTC).
FILETIME 结构 return 由 GetFileTime returns 从 1601 年 1 月 1 日开始的 100 纳秒间隔的数量。您可以在此处查看相关文档:Microsoft docs
没有添加 1600 年,而是有一个内置的 .net 函数可以为您转换 - DateTime.FromFileTime()
。在您的示例中,代码为:
if (GetFileTime(fileObj, ref millies, ref l1, ref l2))
{
DateTime creationTime = DateTime.FromFileTime(millies);
}
我还要更改 millies
的变量名称,因为这有点误导(GetFileTime 不会 return 毫秒)。
我的文件路径很长,所以只能使用 SafeFileHandle
.
来处理
想要获取创建日期时间。
当尝试获得 millies 然后在 DateTime
中转换时,它会减少 1600 年。
代码:
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern bool GetFileTime(SafeFileHandle hFile, ref long lpCreationTime, ref long lpLastAccessTime, ref long lpLastWriteTime);
void fnc(String file){
var filePath = @"\?\" + file;
var fileObj = CreateFile(filePath, Constants.SafeFile.GENERIC_READ, 0, IntPtr.Zero, Constants.SafeFile.OPEN_EXISTING, 0, IntPtr.Zero);
long millies = 0, l1 = 0, l2 = 0;
if(GetFileTime(fileObj, ref millies, ref l1, ref l2))
{
DateTime creationTime = new DateTime(millies, DateTimeKind.Local);
以上creationTime
少了1600年。它不是 2019 年,而是 0419。
然后我不得不这样做
DateTime creationTime = new DateTime(millies, DateTimeKind.Local).AddYears(1600);
}
}
上面creationTime
是正确的,因为我加了1600年。
是什么让日期少了 1600 年?
我做错了什么吗?
这完全是处理文件时间时设计的。
返回文件时间的基础是 1601 年 1 月 1 日的计数器:
A file time is a 64-bit value that represents the number of 100-nanosecond intervals that have elapsed since 12:00 A.M. January 1, 1601 Coordinated Universal Time (UTC).
FILETIME 结构 return 由 GetFileTime returns 从 1601 年 1 月 1 日开始的 100 纳秒间隔的数量。您可以在此处查看相关文档:Microsoft docs
没有添加 1600 年,而是有一个内置的 .net 函数可以为您转换 - DateTime.FromFileTime()
。在您的示例中,代码为:
if (GetFileTime(fileObj, ref millies, ref l1, ref l2))
{
DateTime creationTime = DateTime.FromFileTime(millies);
}
我还要更改 millies
的变量名称,因为这有点误导(GetFileTime 不会 return 毫秒)。