using System; using System.Collections.Generic; using System.IO; namespace osrepodbmgr.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) { 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) { foreach (string directory in Directory.EnumerateDirectories(path, searchPattern)) { DirectoryInfo di = new DirectoryInfo(directory); if (!di.Attributes.HasFlag(FileAttributes.ReparsePoint)) directories.Add(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 links = 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)) links.Add(file); } if (searchOption == SearchOption.AllDirectories) { 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; } } }