using System; using System.ComponentModel; using System.IO; using System.Runtime.InteropServices; namespace QVCopier.Utility.FindFile { internal static class FindFileApi { [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] private static extern IntPtr FindFirstFileEx( string lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, out WIN32_FIND_DATA lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, IntPtr lpSearchFilter, int dwAdditionalFlags); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] private static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData); [DllImport("kernel32.dll")] private static extern bool FindClose(IntPtr hFindFile); // dwAdditionalFlags: private const int FIND_FIRST_EX_CASE_SENSITIVE = 1; private const int FIND_FIRST_EX_LARGE_FETCH = 2; public static void Find(string fileNameOrPath) { FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoStandard; int additionalFlags = 0; if (Environment.OSVersion.Version.Major >= 6) { findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic; additionalFlags = FIND_FIRST_EX_LARGE_FETCH; } var hFile = FindFirstFileEx( fileNameOrPath, findInfoLevel, out var findData, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, additionalFlags); int error = Marshal.GetLastWin32Error(); if (error == 2) { hFile = FindFirstFileEx( Path.Combine(fileNameOrPath, "*.*"), findInfoLevel, out findData, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, additionalFlags); } if (hFile.ToInt32() != -1) { do { if ((findData.dwFileAttributes & FileAttributes.Directory) != FileAttributes.Directory) { Console.WriteLine("File {0}", findData.cFileName); } else { Console.WriteLine("Dir {0}", findData.cFileName); } } while (FindNextFile(hFile, out findData)); FindClose(hFile); } else { var ex = new Win32Exception(); } } } }