我正在使用一个库,它可以非常快速地递归扫描文件夹的文件和目录。输出是 List<WIN32_FIND_DATAW>
. Click here to see the contents of the stuct .
我设法使用以下扩展方法将 FILETIME 转换为 DateTime:
public static DateTime convertToDateTime(this System.Runtime.InteropServices.ComTypes.FILETIME time)
{
ulong high = (ulong)time.dwHighDateTime;
int low = time.dwLowDateTime;
uint uLow = (uint)low;
high = high << 32;
return DateTime.FromFileTime((long)(high | (ulong)uLow));
}
我得到的文件大小为:
(UInt64)((nFileSizeHigh * (2 ^ 32)) + nFileSizeLow);
我在网上找到那些方法不记得在哪里了。
无论如何,该库包含一个需要 WIN32_FIND_DATA 列表的方法。我想调用该方法,但我不知道如何创建 WIN32_FIND_DATA 对象
这是我在 C:\驱动器中迭代时创建的随机 WIN32_FIND_DATA 对象
我如何构建相同的对象?我不知道如何获得 cAlternateName,尽管我认为我不需要它。我不知道如何返回并将 DateTime 转换为 FILETIME。最后我不知道如何将文件大小转换为 nFileSizeHigh 和 nFileSizeLow。
库使用此方法来构建 WIN32_FIND_DATAW 对象:
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr FindFirstFileW(string lpFileName, out WIN32_FIND_DATAW lpFindFileData);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATAW lpFindFileData);
[DllImport("kernel32.dll")]
public static extern bool FindClose(IntPtr hFindFile);
也许存在一个public static extern bool FindFile(IntPtr hFindFile, out WIN32_FIND_DATAW lpFindFileData);
方法。这样我就可以构建我需要的 WIN32_FIND_DATAW 对象。
编辑
简而言之,我想通过拥有文件的完整路径来构造一个 WIN32_FIND_DATAW 对象
最佳答案
这里是必要结构的声明。
public struct FILETIME
{
public UInt32 dwLowDateTime;
public UInt32 dwHighDateTime;
}
public unsafe struct WIN32_FIND_DATAW
{
public UInt32 dwFileAttributes;
public FILETIME ftCreationTime;
public FILETIME ftLastAccessTime;
public FILETIME ftLastWriteTime;
public UInt32 nFileSizeHigh;
public UInt32 nFileSizeLow;
public UInt32 dwReserved0;
public UInt32 dwReserved1;
public fixed Char cFileName[256];
public fixed Char cAlternateFileName[14];
}
您可以在 C# 中像通常的结构一样构造和初始化此类对象。
更新:
FILETIME
结构中存储的 64 位整数表示自 1601 年 1 月 1 日(UTC)以来的 100 纳秒间隔数。在 .NET 中,DateTime.Ticks
表示自 0001 年 1 月 1 日午夜 12:00:00 以来经过的 100 纳秒间隔的数量。因此,将 DateTime
转换为FILETIME
您只需要从 DateTime
中减去 1600 年,并将滴答数写为一对无符号 32 位整数。或者您可以直接调用 DateTime.ToFileTimeUtc()
:
FILETIME fileTime = new FILETIME();
Int64 ticks = DateTime.Now.ToFileTimeUtc();
fileTime.dwLowDateTime = (UInt32)ticks;
fileTime.dwHighDateTime = (UInt32)(ticks >> 32);
关于c# - 文件信息到 WIN32_FIND_DATAW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10233761/