1

我的文件路径很长,因此只能使用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 年?
我做错什么了吗?

4

2 回答 2

2

在处理文件时间时,这完全是设计使然。

返回文件时间的基础是 01/01/1601 的计数器:

文件时间是一个 64 位值,表示自协调世界时间 (UTC) 1601 年 1 月 1 日凌晨 12:00 以来经过的 100 纳秒间隔数。

参考官方文档

于 2019-07-31T10:54:07.710 回答
1

GetFileTime 返回的 FILETIME 结构返回从 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 不返回毫秒)。

于 2019-07-31T11:15:39.843 回答