2

我正在使用一个递归地快速扫描文件夹的文件和目录的库。输出是一个List<WIN32_FIND_DATAW>单击此处查看 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:\ Drive 时创建的随机 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 对象

4

1 回答 1

1

这是必要结构的声明。

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# 中的常规结构一样构造和初始化此类对象。

更新: 存储在结构中的 64 位整数FILETIME表示自 1601 年 1 月 1 日(UTC)以来 100 纳秒间隔的数量。在 .NETDateTime.Ticks中,表示自 0001 年 1 月 1 日午夜 12:00:00 以来经过的 100 纳秒间隔数。因此,要转换DateTimeFILETIME您只需减去 1600 年DateTime并将刻度数写为一对无符号 32位整数。或者你可以打电话DateTime.ToFileTimeUtc()

FILETIME fileTime = new FILETIME();
Int64 ticks = DateTime.Now.ToFileTimeUtc();
fileTime.dwLowDateTime = (UInt32)ticks;
fileTime.dwHighDateTime = (UInt32)(ticks >> 32);
于 2012-04-19T18:56:10.030 回答