/// <summary> /// Creates the <see cref="File"/> base on <see cref="FileInfo"/>. /// </summary> /// <param name="info">The file info.</param> /// <param name="parent">The parent</param> /// <returns>The result file.</returns> /// <remarks> /// It can't be merged with <see cref="DirectoryExtensions.ToDirectory"/>, /// because <see cref="DirectoryInfo"/> and <see cref="FileInfo"/> have different hierarchy. /// </remarks> public static Data.File ToFile(this FileInfo info, Data.Directory parent) { var file = new Data.File { Name = info.FullName, Parent = parent, CreationDate = info.CreationTime, LastAccessDate = info.LastAccessTime, ModificationDate = info.LastWriteTime, Size = info.Length }; var access = info.GetAccessControl(); try { file.Owner = access.GetOwner(typeof(System.Security.Principal.NTAccount)).Value; } catch (Exception) { file.Owner = "N/A"; } file.Attributes = EnumUtil.GetNameValue <FileAttributes>().Where(o => (info.Attributes & o.Value) > 0).Select(o => o.Key).ToArray(); file.UserRights = new[] { "N/A" }; var currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name; foreach (FileSystemAccessRule rule in access.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) { if (rule.IdentityReference.Value == currentUser) { file.UserRights = EnumUtil.GetNameValue <FileSystemRights>().Where(o => (rule.FileSystemRights & o.Value) > 0).Select(o => o.Key).ToArray(); break; } } return(file); }
private Data.Directory SearchDirectoryInternal(DirectoryInfo directoryInfo, CancellationToken token, Data.Directory parent = null) { var directory = directoryInfo.ToDirectory(parent); try { foreach (var fileInfo in directoryInfo.EnumerateFiles()) { if (token.IsCancellationRequested) { return(directory); } directory.Files.Add(fileInfo.ToFile(directory)); } } catch (Exception ex) { this.error.OnNext(ex.Message); } try { foreach (var subDirectoryInfo in directoryInfo.EnumerateDirectories()) { if (token.IsCancellationRequested) { return(directory); } directory.SubDirectories.Add(this.SearchDirectoryInternal(subDirectoryInfo, token, directory)); } } catch (Exception ex) { this.error.OnNext(ex.Message); } directory.Size = directory.Items.Sum(o => o.Size); return(directory); }