我的文件路径很长,因此只能使用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年?
我做错什么了吗?
最佳答案
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不会返回毫秒)。关于c# - 如何从很长的路径获取文件的创建日期时间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57289053/