FileInfo到WIN32_FIND_DATAW

时间:2012-04-19 17:45:15

标签: c# file casting kernel

我正在使用一个库,以递归方式快速扫描文件夹的文件和目录。输出为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:\ Drive

时创建的随机WIN32_FIND_DATA对象

enter image description here

我怎样才能构建同一个对象?我不知道如何获得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对象

1 个答案:

答案 0 :(得分: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#中构建和初始化此类对象,就像通常的结构一样。

<强>更新 存储在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);