/// <summary> /// Recursive method to walk the hierarchy and find the file requested. /// </summary> /// <param name="path">Base path</param> /// <param name="searchFile">Filename to search for</param> /// <param name="direction">Search up or down the tree including base path</param> /// <returns></returns> private static string FindFileInHierarchyInternal(string path, string searchFile, FindFileInHierarchyDirection direction = FindFileInHierarchyDirection.Up) { if (path == null) { return(null); } var dir = new DirectoryInfo(path); var so = SearchOption.TopDirectoryOnly; if (direction == FindFileInHierarchyDirection.Down) { so = SearchOption.AllDirectories; } var files = dir.GetFiles(searchFile, so); if (files.Length > 0) { return(files[0].FullName); // closest match } if (direction == FindFileInHierarchyDirection.Down) { return(null); } if (dir.Parent == null) { return(null); } return(FindFileInHierarchyInternal(dir.Parent.FullName, searchFile, FindFileInHierarchyDirection.Up)); }
/// <summary> /// Searches for a file name based on a current file location up or down the /// directory hierarchy including the current folder. First file match is returned. /// </summary> /// <param name="currentPath">Current path or filename to determine start folder to search up from</param> /// <param name="searchFile">File name to search for. Should be a filename but can contain wildcards</param> /// <param name="direction">Search up or down the directory hierarchy including base path</param> /// <returns></returns> public static string FindFileInHierarchy(string currentPath, string searchFile, FindFileInHierarchyDirection direction = FindFileInHierarchyDirection.Up) { string filename = null; string path = null; var fi = new FileInfo(currentPath); if (!fi.Exists) { var di = new DirectoryInfo(currentPath); if (!di.Exists) { return(null); } path = di.FullName; } else { path = fi.DirectoryName; } return(FindFileInHierarchyInternal(path, searchFile, direction)); }
/// <summary> /// Recursive method to walk the hierarchy and find the file requested. /// </summary> /// <param name="path">Base path</param> /// <param name="searchFile">Filename to search for</param> /// <param name="direction">Search up or down the tree including base path</param> /// <returns></returns> private static string[] FindFilesInHierarchyInternal(string path, string searchFile, FindFileInHierarchyDirection direction = FindFileInHierarchyDirection.Up) { var list = new string[] { }; if (path == null) { return(list); } var dir = new DirectoryInfo(path); var so = SearchOption.TopDirectoryOnly; if (direction == FindFileInHierarchyDirection.Down) { so = SearchOption.AllDirectories; } var files = dir.GetFiles(searchFile, so); if (files.Length > 0) { return(files.Select(fi => fi.FullName).ToArray()); } if (direction == FindFileInHierarchyDirection.Down) { return(list); } if (dir.Parent == null) { return(list); } return(FindFilesInHierarchyInternal(dir.Parent.FullName, searchFile, FindFileInHierarchyDirection.Up)); }
/// <summary> /// Returns a list of file matches searching up and down a file hierarchy /// </summary> /// <param name="startPath">Path to start from</param> /// <param name="searchFile">Filename or Wildcard</param> /// <param name="direction">up or down the hiearchy</param> /// <returns></returns> public static string[] FindFilesInHierarchy(string startPath, string searchFile, FindFileInHierarchyDirection direction = FindFileInHierarchyDirection.Down) { var list = new string[] { }; var fi = new FileInfo(startPath); if (!fi.Exists) { var di = new DirectoryInfo(startPath); if (!di.Exists) { return(list); } startPath = di.FullName; } else { startPath = fi.DirectoryName; } return(FindFilesInHierarchyInternal(startPath, searchFile, direction)); }