void worker_DoWork(object sender, DoWorkEventArgs e) { var rootDir = (string)e.Argument; try { var dir = new DirectoryInfo(rootDir); var re = new Regex(@"^[a-zA-Z]:\$", RegexOptions.IgnoreCase); FileSizeContext context; if (re.Match(rootDir).Success) { context = new FileSizeContext(new DriveInfo(rootDir).TotalFreeSpace); } else { context = new FileSizeContext(0); } // TODO: progress.IsIndeterminate = (context.DiskSize == 0); DirectorySizeItem dsi = LoadDirectoryRecursive(context, dir); ResolveSizeRecursive(dsi); _worker.ReportProgress(0, dsi); } catch (Exception exp) { ((App)Application.Current).LogException(exp); } }
private void ResolveSizeRecursive(DirectorySizeItem dsi) { foreach (var subDsi in dsi.SubDirectories) { ResolveSizeRecursive(subDsi); } dsi.SubDirectories.Sort(); dsi.Files.Sort(); dsi.ResolveSize(); }
private DirectorySizeItem LoadDirectoryRecursive(FileSizeContext context, DirectoryInfo di) { var dsi = new DirectorySizeItem(context); dsi.Load(di); if (di.FullName.Length >= 230) // 再向下查找超过260个字符有可能引起异常,略过 { return(dsi); } try { foreach (var fi in di.GetFiles()) { var fsi = new FileSizeItem(context); fsi.Load(fi); dsi.Files.Add(fsi); context.ReadedSize += fsi.Size; } } catch (UnauthorizedAccessException) { } _worker.ReportProgress(context.ReadedPercentage, string.Format("正在读取目录: {0}", di.FullName)); try { foreach (var subDi in di.GetDirectories()) { var subDsi = LoadDirectoryRecursive(context, subDi); dsi.SubDirectories.Add(subDsi); } } catch (UnauthorizedAccessException) { } return(dsi); }