public static void TraverseDirectory(string directory, OnFileHandler onfile, OnDirectoryHandler ondir, CheckCancelHandler checkCancel, bool recurse) { var invalidHandleValue = new IntPtr(-1); WIN32_FIND_DATA findData; if (directory.StartsWith(".")) { directory = Environment.CurrentDirectory + directory.Substring(1); } directory = directory.Replace("/", "\\"); if (directory.EndsWith("\\")) { directory = directory.Substring(0, directory.Length - 1); } IntPtr findHandle = FindFirstFile(@"\\?\" + directory + @"\*", out findData); if (findHandle != invalidHandleValue) { do { // Check if we should stop! if (checkCancel != null) { if (checkCancel()) { FindClose(findHandle); break; } } if ((findData.dwFileAttributes & FileAttributes.Directory) != 0) { if (findData.cFileName != "." && findData.cFileName != "..") { string subdirectory = directory + (directory.EndsWith(@"\") ? "" : @"\") + findData.cFileName; if (!IsLink(subdirectory)) { if (ondir != null) { ondir(findData, subdirectory); } if (recurse) { TraverseDirectory(subdirectory, onfile, ondir, checkCancel, true); } } } } else { // File if (onfile != null) { onfile(findData, directory); } // size += (long)findData.nFileSizeLow + (long)findData.nFileSizeHigh * 4294967296; } } while (FindNextFile(findHandle, out findData)); FindClose(findHandle); } }
public static void RecurseDirectory(string directory, OnFileHandler onfile, OnDirectoryHandler ondir, CheckCancelHandler checkCancel) { TraverseDirectory(directory, onfile, ondir, checkCancel, true); }