FindFileApi.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.ComponentModel;
  3. using System.IO;
  4. using System.Runtime.InteropServices;
  5. namespace QVCopier.Utility.FindFile
  6. {
  7. internal static class FindFileApi
  8. {
  9. [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
  10. private static extern IntPtr FindFirstFileEx(
  11. string lpFileName,
  12. FINDEX_INFO_LEVELS fInfoLevelId,
  13. out WIN32_FIND_DATA lpFindFileData,
  14. FINDEX_SEARCH_OPS fSearchOp,
  15. IntPtr lpSearchFilter,
  16. int dwAdditionalFlags);
  17. [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  18. private static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData);
  19. [DllImport("kernel32.dll")]
  20. private static extern bool FindClose(IntPtr hFindFile);
  21. // dwAdditionalFlags:
  22. private const int FIND_FIRST_EX_CASE_SENSITIVE = 1;
  23. private const int FIND_FIRST_EX_LARGE_FETCH = 2;
  24. public static void Find(string fileNameOrPath)
  25. {
  26. FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoStandard;
  27. int additionalFlags = 0;
  28. if (Environment.OSVersion.Version.Major >= 6)
  29. {
  30. findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
  31. additionalFlags = FIND_FIRST_EX_LARGE_FETCH;
  32. }
  33. var hFile = FindFirstFileEx(
  34. fileNameOrPath,
  35. findInfoLevel,
  36. out var findData,
  37. FINDEX_SEARCH_OPS.FindExSearchNameMatch,
  38. IntPtr.Zero,
  39. additionalFlags);
  40. int error = Marshal.GetLastWin32Error();
  41. if (error == 2)
  42. {
  43. hFile = FindFirstFileEx(
  44. Path.Combine(fileNameOrPath, "*.*"),
  45. findInfoLevel,
  46. out findData,
  47. FINDEX_SEARCH_OPS.FindExSearchNameMatch,
  48. IntPtr.Zero,
  49. additionalFlags);
  50. }
  51. if (hFile.ToInt32() != -1)
  52. {
  53. do
  54. {
  55. if ((findData.dwFileAttributes & FileAttributes.Directory) != FileAttributes.Directory)
  56. {
  57. Console.WriteLine("File {0}", findData.cFileName);
  58. }
  59. else
  60. {
  61. Console.WriteLine("Dir {0}", findData.cFileName);
  62. }
  63. }
  64. while (FindNextFile(hFile, out findData));
  65. FindClose(hFile);
  66. }
  67. else
  68. {
  69. var ex = new Win32Exception();
  70. }
  71. }
  72. }
  73. }