//Code based heavily on https://stackoverflow.com/q/47471744 static bool FindNextFilePInvokeRecursive(string path, out List <FileInformation> files, out List <DirectoryInformation> directories, Log.Logger logger) { List <FileInformation> fileList = new List <FileInformation>(); List <DirectoryInformation> directoryList = new List <DirectoryInformation>(); IntPtr findHandle = INVALID_HANDLE_VALUE; List <Tuple <string, DateTime> > info = new List <Tuple <string, DateTime> >(); try { findHandle = FindFirstFileW(path + @"\*", out WIN32_FIND_DATAW findData); if (findHandle != INVALID_HANDLE_VALUE) { do { if (findData.cFileName != "." && findData.cFileName != "..") { string fullPath = path + @"\" + findData.cFileName; if (findData.dwFileAttributes.HasFlag(FileAttributes.Directory) && !findData.dwFileAttributes.HasFlag(FileAttributes.ReparsePoint)) { var dirdata = new DirectoryInformation { FullPath = fullPath, LastWriteTime = findData.ftLastWriteTime.ToDateTime() }; directoryList.Add(dirdata); List <FileInformation> subDirectoryFileList = new List <FileInformation>(); List <DirectoryInformation> subDirectoryDirectoryList = new List <DirectoryInformation>(); if (FindNextFilePInvokeRecursive(fullPath, out subDirectoryFileList, out subDirectoryDirectoryList, logger)) { fileList.AddRange(subDirectoryFileList); directoryList.AddRange(subDirectoryDirectoryList); } } else if (!findData.dwFileAttributes.HasFlag(FileAttributes.Directory)) { var filedata = new FileInformation { FullPath = fullPath, LastWriteTime = findData.ftLastWriteTime.ToDateTime(), Size = (long)findData.nFileSizeLow + (long)findData.nFileSizeHigh * 4294967296 }; fileList.Add(filedata); } } } while (FindNextFile(findHandle, out findData)); } } catch (Exception exception) { Console.WriteLine(exception.ToString()); if (findHandle != INVALID_HANDLE_VALUE) { FindClose(findHandle); } files = null; directories = null; return(false); } if (findHandle != INVALID_HANDLE_VALUE) { FindClose(findHandle); } files = fileList; directories = directoryList; return(true); }
static bool FindNextFilePInvokeRecursiveParalleled(string path, out List <FileInformation> files, out List <DirectoryInformation> directories, Log.Logger logger) { List <FileInformation> fileList = new List <FileInformation>(); object fileListLock = new object(); List <DirectoryInformation> directoryList = new List <DirectoryInformation>(); object directoryListLock = new object(); IntPtr findHandle = INVALID_HANDLE_VALUE; List <Tuple <string, DateTime> > info = new List <Tuple <string, DateTime> >(); try { path = path.EndsWith(@"\") ? path : path + @"\"; findHandle = FindFirstFileW(path + @"*", out WIN32_FIND_DATAW findData); if (findHandle != INVALID_HANDLE_VALUE) { do { if (findData.cFileName != "." && findData.cFileName != "..") { string fullPath = path + findData.cFileName; if (findData.dwFileAttributes.HasFlag(FileAttributes.Directory) && !findData.dwFileAttributes.HasFlag(FileAttributes.ReparsePoint)) { var dirdata = new DirectoryInformation { FullPath = fullPath, LastWriteTime = findData.ftLastWriteTime.ToDateTime() }; directoryList.Add(dirdata); } else if (!findData.dwFileAttributes.HasFlag(FileAttributes.Directory)) { var filedata = new FileInformation { FullPath = fullPath, LastWriteTime = findData.ftLastWriteTime.ToDateTime() }; fileList.Add(filedata); } } } while (FindNextFile(findHandle, out findData)); directoryList.AsParallel().ForAll(x => { List <FileInformation> subDirectoryFileList = new List <FileInformation>(); List <DirectoryInformation> subDirectoryDirectoryList = new List <DirectoryInformation>(); if (FindNextFilePInvokeRecursive(x.FullPath, out subDirectoryFileList, out subDirectoryDirectoryList, logger)) { lock (fileListLock) { fileList.AddRange(subDirectoryFileList); } lock (directoryListLock) { directoryList.AddRange(subDirectoryDirectoryList); } } }); } } catch (Exception exception) { Console.WriteLine(exception.ToString()); if (findHandle != INVALID_HANDLE_VALUE) { FindClose(findHandle); } files = null; directories = null; return(false); } if (findHandle != INVALID_HANDLE_VALUE) { FindClose(findHandle); } files = fileList; directories = directoryList; return(true); }