@@ -170,4 +170,59 @@ public static string GetSilentUninstallCommand(InstalledProgram program)
170170 _ => ""
171171 } ;
172172 }
173+
174+ public static void ComputeActualSizes ( IList < InstalledProgram > programs )
175+ {
176+ Parallel . ForEach ( programs , new ParallelOptions { MaxDegreeOfParallelism = 4 } , prog =>
177+ {
178+ long total = 0 ;
179+ var paths = new List < string > ( ) ;
180+
181+ if ( ! string . IsNullOrEmpty ( prog . InstallLocation ) && Directory . Exists ( prog . InstallLocation ) )
182+ paths . Add ( prog . InstallLocation ) ;
183+
184+ var appDataDirs = new [ ]
185+ {
186+ Environment . GetFolderPath ( Environment . SpecialFolder . ApplicationData ) ,
187+ Environment . GetFolderPath ( Environment . SpecialFolder . LocalApplicationData ) ,
188+ Environment . GetFolderPath ( Environment . SpecialFolder . CommonApplicationData ) ,
189+ } ;
190+
191+ var nameTerms = new List < string > ( ) ;
192+ if ( ! string . IsNullOrEmpty ( prog . DisplayName ) ) nameTerms . Add ( prog . DisplayName ) ;
193+ if ( ! string . IsNullOrEmpty ( prog . InstallLocation ) )
194+ {
195+ var folderName = Path . GetFileName ( prog . InstallLocation . TrimEnd ( '\\ ' ) ) ;
196+ if ( ! string . IsNullOrEmpty ( folderName ) && folderName . Length > 2 ) nameTerms . Add ( folderName ) ;
197+ }
198+
199+ foreach ( var appDataDir in appDataDirs )
200+ {
201+ if ( string . IsNullOrEmpty ( appDataDir ) || ! Directory . Exists ( appDataDir ) ) continue ;
202+ try
203+ {
204+ foreach ( var sub in Directory . GetDirectories ( appDataDir ) )
205+ {
206+ var subName = Path . GetFileName ( sub ) ;
207+ if ( nameTerms . Any ( t => subName . Equals ( t , StringComparison . OrdinalIgnoreCase ) ) )
208+ paths . Add ( sub ) ;
209+ }
210+ }
211+ catch { }
212+ }
213+
214+ foreach ( var path in paths . Distinct ( StringComparer . OrdinalIgnoreCase ) )
215+ {
216+ try
217+ {
218+ total += new DirectoryInfo ( path )
219+ . EnumerateFiles ( "*" , SearchOption . AllDirectories )
220+ . Sum ( fi => { try { return fi . Length ; } catch { return 0L ; } } ) ;
221+ }
222+ catch { }
223+ }
224+
225+ if ( total > 0 ) prog . ActualSizeBytes = total ;
226+ } ) ;
227+ }
173228}
0 commit comments