Skip to content

Commit 5d3748d

Browse files
committed
Support dynamic UI updates while counting
1 parent 61ce77a commit 5d3748d

File tree

2 files changed

+48
-20
lines changed

2 files changed

+48
-20
lines changed

SharpDiskSweeper/DiskSweeper/DiskItem.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ public class DiskItem : INotifyPropertyChanged
2828

2929
public string SizeString => this.IsCalculationDone
3030
? DiskItem.FormatSize(this.Size)
31-
: "(...)";
31+
: "..." + DiskItem.FormatSize(this.Size);
3232

3333
public string SizeOnDiskString => this.IsCalculationDone
3434
? DiskItem.FormatSize(this.SizeOnDisk)
35-
: "(...)";
35+
: "..." + DiskItem.FormatSize(this.SizeOnDisk);
3636

3737
public event PropertyChangedEventHandler PropertyChanged;
3838

@@ -74,10 +74,20 @@ public async Task Start(CancellationToken cancellationToken)
7474
return;
7575
}
7676

77-
(this.Size, this.SizeOnDisk, this.FilesCount, this.FoldersCount) = await Task.Run(() => SweepEngine
78-
.CalculateDirectorySizeRecursivelyAsync(this.DirInfo, cancellationToken));
77+
var engine = new SweepEngine(this.DirInfo);
78+
engine.ReportProgress += (sender, e) => this.ReportChanges(engine);
79+
80+
await Task.Run(() => engine
81+
.CalculateDirectorySizeRecursivelyWithUpdateAsync(this.DirInfo, cancellationToken));
7982

8083
this.IsCalculationDone = true;
84+
this.ReportChanges(engine);
85+
}
86+
87+
private void ReportChanges(SweepEngine engine)
88+
{
89+
(this.Size, this.SizeOnDisk, this.FilesCount, this.FoldersCount) = engine.Result;
90+
8191
this.NotifyPropertyChanged(nameof(this.Size));
8292
this.NotifyPropertyChanged(nameof(this.SizeString));
8393
this.NotifyPropertyChanged(nameof(this.SizeOnDisk));

SharpDiskSweeper/DiskSweeper/SweepEngine.cs

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@ namespace DiskSweeper
1313
public class SweepEngine
1414
{
1515
private readonly DirectoryInfo Directory;
16+
private const int ProgressReportInterval = 200;
17+
18+
private long TotalSize;
19+
private long TotalSizeOnDisk;
20+
private long TotalFilesCount;
21+
private long TotalFoldersCount;
22+
23+
private long ChangesCount;
24+
25+
public event EventHandler ReportProgress;
26+
27+
public (long, long, long, long) Result => (this.TotalSize, this.TotalSizeOnDisk, this.TotalFilesCount, this.TotalFoldersCount);
1628

1729
public static long P0SizeFloor => ConfigurationHelper.GetConfigurationInt64(
1830
settingName: "DiskSweeper.Highlights.P0.SizeFloor",
@@ -27,6 +39,11 @@ public SweepEngine(string path)
2739
this.Directory = new DirectoryInfo(path);
2840
}
2941

42+
public SweepEngine(DirectoryInfo dir)
43+
{
44+
this.Directory = dir;
45+
}
46+
3047
public ObservableCollection<DiskItem> GetDiskItems()
3148
{
3249
return new ObservableCollection<DiskItem>(
@@ -35,33 +52,27 @@ public ObservableCollection<DiskItem> GetDiskItems()
3552
.Select(info => new DiskItem(info)));
3653
}
3754

38-
public static async Task<(long, long, long, long)> CalculateDirectorySizeRecursivelyAsync(DirectoryInfo directory, CancellationToken cancellationToken)
55+
public async Task CalculateDirectorySizeRecursivelyWithUpdateAsync(DirectoryInfo directory, CancellationToken cancellationToken)
3956
{
40-
var totalSize = 0L;
41-
var totalSizeOnDisk = 0L;
42-
var totalFilesCount = 0L;
43-
var totalFoldersCount = 0L;
44-
4557
try
4658
{
4759
foreach (var childDirectory in directory.GetDirectories())
4860
{
49-
var (size, sizeOnDisk, filesCount, foldersCount) = await SweepEngine.CalculateDirectorySizeRecursivelyAsync(childDirectory, cancellationToken);
50-
totalSize += size;
51-
totalSizeOnDisk += sizeOnDisk;
52-
totalFilesCount += filesCount;
53-
totalFoldersCount += foldersCount;
61+
await this.CalculateDirectorySizeRecursivelyWithUpdateAsync(childDirectory, cancellationToken);
5462

5563
if (cancellationToken.IsCancellationRequested)
5664
{
5765
break;
5866
}
5967
}
6068

61-
totalSize += directory.GetFiles().Sum(file => file.Length);
62-
//totalSizeOnDisk += directory.GetFiles().Sum(file => file.GetSizeOnDisk());
63-
totalFilesCount += directory.GetFiles().Count();
64-
totalFoldersCount += 1;
69+
var files = directory.GetFiles();
70+
this.TotalSize += files.Sum(file => file.Length);
71+
//this.TotalSizeOnDisk += files.Sum(file => file.GetSizeOnDisk());
72+
this.TotalFilesCount += files.Count();
73+
this.TotalFoldersCount += 1;
74+
75+
this.CountChanges();
6576
}
6677
catch (UnauthorizedAccessException ex)
6778
{
@@ -71,8 +82,15 @@ public ObservableCollection<DiskItem> GetDiskItems()
7182
{
7283
Trace.WriteLine(ex.Message);
7384
}
85+
}
7486

75-
return (totalSize, totalSizeOnDisk, totalFilesCount, totalFoldersCount);
87+
private void CountChanges()
88+
{
89+
this.ChangesCount++;
90+
if (this.ChangesCount % SweepEngine.ProgressReportInterval == 0)
91+
{
92+
this.ReportProgress?.Invoke(this, null);
93+
}
7694
}
7795
}
7896
}

0 commit comments

Comments
 (0)