using System.Collections.Generic; using System.IO; using System.Linq; namespace apprepodbmgr.Core { public static class IO { public static List EnumerateFiles(string path, string searchPattern, SearchOption searchOption, bool followLinks = true, bool symlinks = true) { if(followLinks) return new List(Directory.EnumerateFiles(path, searchPattern, searchOption)); List files = new List(); List directories = new List(); foreach(string file in Directory.EnumerateFiles(path, searchPattern)) { FileInfo fi = new FileInfo(file); if(fi.Attributes.HasFlag(FileAttributes.ReparsePoint) && symlinks) files.Add(file); else if(!fi.Attributes.HasFlag(FileAttributes.ReparsePoint)) files.Add(file); } if(searchOption != SearchOption.AllDirectories) return files; foreach(string directory in Directory.EnumerateDirectories(path, searchPattern)) { DirectoryInfo di = new DirectoryInfo(directory); if(!di.Attributes.HasFlag(FileAttributes.ReparsePoint)) files.AddRange(EnumerateFiles(directory, searchPattern, searchOption, followLinks, symlinks)); } return files; } public static List EnumerateDirectories(string path, string searchPattern, SearchOption searchOption, bool followLinks = true, bool symlinks = true) { if(followLinks) return new List(Directory.EnumerateDirectories(path, searchPattern, searchOption)); List directories = new List(); if(searchOption != SearchOption.AllDirectories) return directories; directories.AddRange(from directory in Directory.EnumerateDirectories(path, searchPattern) let di = new DirectoryInfo(directory) where !di.Attributes.HasFlag(FileAttributes.ReparsePoint) select directory); List newDirectories = new List(); foreach(string directory in directories) newDirectories.AddRange(EnumerateDirectories(directory, searchPattern, searchOption, followLinks, symlinks)); directories.AddRange(newDirectories); return directories; } public static List EnumerateSymlinks(string path, string searchPattern, SearchOption searchOption) { List directories = new List(); List links = (from file in Directory.EnumerateFiles(path, searchPattern) let fi = new FileInfo(file) where fi.Attributes.HasFlag(FileAttributes.ReparsePoint) select file).ToList(); if(searchOption != SearchOption.AllDirectories) return links; foreach(string directory in Directory.EnumerateDirectories(path, searchPattern)) { DirectoryInfo di = new DirectoryInfo(directory); if(!di.Attributes.HasFlag(FileAttributes.ReparsePoint)) directories.Add(directory); else //if (!links.Contains(directory)) links.Add(directory); } foreach(string directory in directories) links.AddRange(EnumerateSymlinks(directory, searchPattern, searchOption)); return links; } } }