private void AddToTable(Table table, IFileSystemInformation info) { table.AddRow ( info.LastWriteTime.ToString(DefaultTimeFormat), (info is IDirectoryInformation) ? "<DIR>" : "", (info is IFileInformation) ? ((IFileInformation)info).Length.ToString(DefaultNumberFormat) : "", info.Name ); }
/// <summary> /// Walk directories in the current directory. Allows filtering by attributes. Folders with the given attributes will be skipped as well. /// </summary> /// <param name="fileSystemInformation">If the information is not a directory, returns an empty enumerable.</param> public static IEnumerable <IDirectoryInformation> EnumerateDirectories( this IFileSystemInformation fileSystemInformation, string searchPattern = "*", SearchOption searchOption = SearchOption.TopDirectoryOnly, FileAttributes excludeAttributes = FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReparsePoint) { var directoryInfo = fileSystemInformation as IDirectoryInformation; if (directoryInfo == null) { return(Enumerable.Empty <IDirectoryInformation>()); } return(directoryInfo.EnumerateChildren(ChildType.Directory, searchPattern, searchOption, excludeAttributes).OfType <IDirectoryInformation>()); }
internal static IEnumerable <IFileSystemInformation> EnumerateChildrenInternal( string directory, ChildType childType, string searchPattern, System.IO.SearchOption searchOption, System.IO.FileAttributes excludeAttributes, IFileService fileService) { var firstFile = NativeMethods.FileManagement.FindFirstFile(Paths.Combine(directory, searchPattern)); var findInfo = firstFile; if (firstFile != null) { // Look for specified file/directories do { bool isDirectory = findInfo.Attributes.HasFlag(System.IO.FileAttributes.Directory); if ((findInfo.Attributes & excludeAttributes) == 0 && findInfo.FileName != "." && findInfo.FileName != ".." && ((isDirectory && childType == ChildType.Directory) || (!isDirectory && childType == ChildType.File))) { yield return(FileSystemInformation.Create(findInfo, fileService)); } findInfo = NativeMethods.FileManagement.FindNextFile(firstFile); } while (findInfo != null); firstFile.FindHandle.Close(); } if (searchOption != System.IO.SearchOption.AllDirectories) { yield break; } // Need to recurse to find additional matches firstFile = NativeMethods.FileManagement.FindFirstFile(Paths.Combine(directory, "*"), directoriesOnly: true); if (firstFile == null) { yield break; } findInfo = firstFile; do { if ((findInfo.Attributes & excludeAttributes) == 0 && findInfo.Attributes.HasFlag(System.IO.FileAttributes.Directory) && findInfo.FileName != "." && findInfo.FileName != "..") { IFileSystemInformation childDirectory = DirectoryInformation.Create(findInfo, fileService); foreach (var child in EnumerateChildrenInternal(childDirectory.Path, childType, searchPattern, searchOption, excludeAttributes, fileService)) { yield return(child); } } findInfo = NativeMethods.FileManagement.FindNextFile(firstFile); } while (findInfo != null); firstFile.FindHandle.Close(); }