SharePoint使用API​​获取单个Web站点的大小

时间:2010-03-01 18:04:54

标签: c# sharepoint sharepoint-2007

现在,我用来计算大小的是文件夹中的文件。我认为这不是全部,因为内容数据库大小约为15gb。当我计算所有文件的大小时,我得到10gb左右。有谁知道我可能缺少什么?

这是我到目前为止的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using System.Globalization;

namespace WebSizeTesting
{
class Program
{


    static void Main(string[] args)
    {
        long SiteCollectionBytes = 0;

        using (SPSite mainSite = new SPSite("http://sharepoint-test"))
        {
            // loop through the websites
            foreach (SPWeb web in mainSite.AllWebs)
            {

                long webBytes = GetSPFolderSize(web.RootFolder);

                // Add in size of each web site's recycle bin

                webBytes += web.RecycleBin.OfType<SPRecycleBinItem>().Select(item => item.Size).ToArray<long>().Sum();

                Console.WriteLine("Url: {0}, Size: {1}", web.Url, ConvertBytesToDisplayText( webBytes ));

                SiteCollectionBytes += webBytes;
            }


            long siteCollectionRecycleBinBytes = mainSite.RecycleBin.OfType<SPRecycleBinItem>().Select(item => item.Size).ToArray<long>().Sum();

            Console.WriteLine("Site Collection Recycle Bin: " + ConvertBytesToDisplayText(siteCollectionRecycleBinBytes));

            SiteCollectionBytes += siteCollectionRecycleBinBytes;
        }

        Console.WriteLine("Total Size: " + ConvertBytesToDisplayText(SiteCollectionBytes));

        Console.ReadKey();
    }



    public static long GetSPFolderSize(SPFolder folder)
    {
        long byteCount = 0;

        // calculate the files in the immediate folder
        foreach (SPFile file in folder.Files)
        {
            byteCount += file.TotalLength;

            // also include file versions
            foreach (SPFileVersion fileVersion in file.Versions)
            {
                byteCount += fileVersion.Size;
            }

        }

        // Handle sub folders
        foreach (SPFolder subFolder in folder.SubFolders)
        {
            byteCount += GetSPFolderSize(subFolder);
        }

        return byteCount;
    }

    public static string ConvertBytesToDisplayText(long byteCount)
    {
        string result = "";

        if (byteCount > Math.Pow(1024, 3))
        {
            // display as gb
            result = (byteCount / Math.Pow(1024, 3)).ToString("#,#.##", CultureInfo.InvariantCulture) + " GB";
        }
        else if (byteCount > Math.Pow(1024, 2))
        {
            // display as mb
            result = (byteCount / Math.Pow(1024, 2)).ToString("#,#.##", CultureInfo.InvariantCulture) + " MB";
        }
        else if (byteCount > 1024)
        {
            // display as kb
            result = (byteCount / 1024).ToString("#,#.##", CultureInfo.InvariantCulture) + " KB";
        }
        else
        {
            // display as bytes
            result = byteCount.ToString("#,#.##", CultureInfo.InvariantCulture) + " Bytes";
        }

        return result;
    }
}
}

编辑2:15 pm 3/1/2010 cst 我添加了计算文件版本作为代码大小的一部分的能力。正如Goyuix在下面的帖子中所建议的那样。它仍然受到相当大的物理数据库大小的影响。

编辑2010年3月3日上午8:38 cst 我在计算每个网站和网站集回收站的回收站大小时添加了。这些变化由ArjanP建议。另外,我想补充一点,我对这种做法更加有效。

3 个答案:

答案 0 :(得分:2)

您是否考虑过垃圾桶?网站和网站集将有罐头,所有这些都占用了内容数据库中的空间。

内容数据库中总会有“开销”......每个“空”Web都会消耗很多字节。 30%似乎很多但不过量,这取决于含量和网络数量的比例。

答案 1 :(得分:1)

内容数据库还存储配置信息,例如实际存在的列表,功能,权限等......虽然这可能不会占用5GB的数据,但需要考虑。此外,每个文件通常还与可能包含该文件的元数据的SPListItem相关联。

您是否为任何列表/库启用了版本控制?如果是这样,您还需要检查每个版本的SPListItem.Versions属性。

答案 2 :(得分:1)

我也不太确定您的代码是否也会考虑列表附件。