This program was designed to iterate through all of my webapplications, drilling down into all the site collections and subsites and to determine the space for each site collection and subsite. Everything works fine if I manually interrogate 1 site collection at a time, but if I try to let it happen programmatically I keep receiving a arithmetic overflow exception. Could someone review my code and explain why this exception only happens when all the web applications are attempted and not when an individual site collection is interrogated?
Here is the code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
namespace SiteSize
{
class Program
{
static void Main(string[] args)
{
long siteCollectionSize = 0;
string baseUrl = "http://intranet";
Console.WriteLine("Base Url: " + baseUrl + " (Change baseUrl to list sites starting with)");
foreach (SPWebApplication mainSite in SPWebService.ContentService.WebApplications)
{
foreach (SPSite siteCollections in mainSite.Sites)
{
foreach (SPWeb web in siteCollections.AllWebs)
{
long webSize = GetSPFolderSize(web.RootFolder) + web.RecycleBin.Cast<SPRecycleBinItem>().Sum(r => r.Size);
if (web.Url.StartsWith(baseUrl))
{
Console.WriteLine(string.Format("({0} {1}", web.Url, FormatSize(webSize)));
siteCollectionSize += webSize;
}
}
}
}
Console.WriteLine("Total Size: " + FormatSize(siteCollectionSize));
}
public static long GetSPFolderSize(SPFolder folder)
{
long folderSize = 0;
foreach (SPFile file in folder.Files)
folderSize += file.TotalLength + file.Versions.Cast<SPFileVersion>().Sum(f => f.Size);
folderSize += folder.SubFolders.Cast<SPFolder>().Sum(sf => GetSPFolderSize(sf));
return folderSize;
}
public static string FormatSize(long size)
{
if (size > Math.Pow(1024, 3))
return (size / Math.Pow(1024, 3)).ToString("#,#.##") + " GB";
else if (size > Math.Pow(1024, 2))
return (size / Math.Pow(1024, 2)).ToString("#,#.##") + " MB";
else if (size > 1024)
return (size / 1024).ToString("#,#.##") + " KB";
else
return size.ToString("#,#.##") + " Bytes";
}
}
}
Here is the error:
Unhandled Exception: System.OverflowException: Arithmetic operation resulted in
an overflow.
at System.Linq.Enumerable.Sum(IEnumerable`1 source)
at System.Linq.Enumerable.Sum[TSource](IEnumerable`1 source, Func`2 selector)
at SiteSize.Program.GetSPFolderSize(SPFolder folder)
at SiteSize.Program.<GetSPFolderSize>b__6(SPFolder sf)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Sum(IEnumerable`1 source)
at System.Linq.Enumerable.Sum[TSource](IEnumerable`1 source, Func`2 selector)
at SiteSize.Program.GetSPFolderSize(SPFolder folder)
at SiteSize.Program.<GetSPFolderSize>b__6(SPFolder sf)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Sum(IEnumerable`1 source)
at System.Linq.Enumerable.Sum[TSource](IEnumerable`1 source, Func`2 selector)
at SiteSize.Program.GetSPFolderSize(SPFolder folder)
at SiteSize.Program.<>c__DisplayClass2.<getInfo>b__0()
at Microsoft.SharePoint.SPSecurity.CodeToRunElevatedWrapper(Object state)
at Microsoft.SharePoint.SPSecurity.<>c__DisplayClass4.<RunWithElevatedPrivile
ges>b__2()
at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunEleva
ted secureCode)
at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback sec
ureCode, Object param)
at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevate
d secureCode)
at SiteSize.Program.getInfo(String site)
at SiteSize.Program.Main(String[] args)
The version property Size is an int. That's the issue.
Try this...
folderSize += file.TotalLength + file.Versions.Cast<SPFileVersion>().Sum(f => (long)f.Size);