using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.AccessControl; using System.Text; using System.Threading.Tasks; namespace RandomFileRunner.IO { public class SmartFileSystem { public static List GetFiles(string path, string pattern) { List fileList = new List(); List directoryList = new List(); directoryList.Add(path); while (true) { if (directoryList.Count <= 0) { break; } string directory = directoryList.First(); directoryList.RemoveAt(0); if (IsDirectoryAccessible(directory)) { IEnumerable searchDirList = new List(); try { searchDirList = Directory.EnumerateDirectories(directory, "*", SearchOption.TopDirectoryOnly); } catch (Exception) { continue; } foreach (string item in searchDirList) { if (!IsDirectoryAccessible(item)) { continue; } directoryList.Add(item); } foreach (string item in Directory.EnumerateFiles(directory, pattern, SearchOption.TopDirectoryOnly)) { if (!IsFileAccessible(item)) { continue; } fileList.Add(item); } } } return fileList; } public static void GetFiles(string path, string pattern, Func callback) { List directoryList = new List(); ulong searchCount = 0; directoryList.Add(path); searchCount++; while (true) { if (directoryList.Count <= 0) { break; } string directory = directoryList.First(); directoryList.RemoveAt(0); callback(null, searchCount, directoryList.Count); if (IsDirectoryAccessible(directory)) { IEnumerable searchDirList = new List(); try { searchDirList = Directory.EnumerateDirectories(directory, "*", SearchOption.TopDirectoryOnly); } catch (Exception) { continue; } foreach (string item in searchDirList) { if (!IsDirectoryAccessible(item)) { continue; } directoryList.Add(item); searchCount++; callback(null, searchCount, directoryList.Count); } foreach (string item in Directory.EnumerateFiles(directory, pattern, SearchOption.TopDirectoryOnly)) { if (!IsFileAccessible(item)) { continue; } callback(item, searchCount, directoryList.Count); } } } } public static bool IsFileAccessible(string filename) { if (string.IsNullOrWhiteSpace(filename)) return false; if (!File.Exists(filename)) return false; try { FileInfo fi = new FileInfo(filename); fi.GetAccessControl(); } catch { return false; } return true; } public static bool IsDirectoryAccessible(string path) { if (string.IsNullOrWhiteSpace(path)) return false; if (!Directory.Exists(path)) return false; try { DirectoryInfo di = new DirectoryInfo(path); di.GetAccessControl(); } catch { return false; } return true; } } }