2

フォルダのファイルとディレクトリを非常に高速に再帰的にスキャンするライブラリを使用しています。出力はList<WIN32_FIND_DATAW>です。スタクトの内容を確認するには、ここをクリックしてください

次の拡張メソッドを使用して、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オブジェクトを作成したいのです。

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ナノ秒間隔の数を表します。.NETではDateTime.Ticks、0001年1月1日深夜12:00:00から経過した100ナノ秒間隔の数を表します。したがって、変換するDateTimeには、 FILETIME1600年を減算し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 に答える