【问题标题】:SharePoint get the size of individual web sites using APISharePoint 使用 API 获取单个网站的大小
【发布时间】:2012-06-29 08:50:13
【问题描述】:

现在我用来计算大小的只是文件夹中的文件。我不认为这就是全部,因为内容数据库大小约为 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;
    }
}
}

edit 2:15 pm 3/1/2010 cst 我添加了将文件版本计数为代码大小的一部分的功能。正如 Goyuix 在下面的帖子中所建议的那样。它仍然与物理数据库大小相差很大。

edit 8:38 am 3/3/2010 cst 我在计算每个网站的回收站大小和网站集回收站时添加了。 ArjanP 建议的这些更改。我还想补充一点,我非常愿意接受更有效的方法。

【问题讨论】:

  • 真正想要回答的问题是什么?听起来您已经从数据库中获得了文件大小。这是出于好奇还是您想要获取的特定信息?
  • 我有数据库的总大小。但是,我想要数据库中每个单独网站的大小,而不仅仅是网站集的大小。更具体地说,最终结果将是一个 silverlight 控件,它在网格中显示站点层次结构以及每个站点的大小。我已经全部搞定了,只是总大小与数据库大小不匹配。

标签: c# sharepoint sharepoint-2007


【解决方案1】:

您考虑过垃圾桶吗?将有用于 Web 和网站集的罐头,它们都占用了内容数据库中的空间。

内容数据库中总会有“开销”。每个“空”Web 都会消耗一些字节。 30% 看起来很多,但也不过分,这取决于内容的比例和网站的数量。

【讨论】:

  • 我已经弄清楚了我认为需要添加到回收站文件中的代码。这些总共增加了大约 500mb。这使我在 15gb 中的总容量达到了 12.2gb,因此仍然是 3gb 的开销。整个过程的一部分是准确指出 sharepoint 安装的每个部分增长最多的位置。我将如何计算您提到的每个网站的开销?
  • 在没有人使用服务器的情况下创建一个新的子站点,看看你的数据库增长了多少..
  • 此外,还有 2 个回收站。每个子站点 1 个,例如 /subsite/_layouts/recyclebin.aspx,站点集合 1 个,请参阅 /_layouts/AdminRecycleBin.aspx
  • 我已经得到了这两个。我计算了一个网站(子站点): webBytes += web.RecycleBin.OfType().Select(item => item.Size).ToArray().Sum();然后我用这个来计算网站集之一: long siteCollectionRecycleBinBytes = mainSite.RecycleBin.OfType().Select(item => item.Size).ToArray().Sum();
【解决方案2】:

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

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

【讨论】:

  • 看起来文件版本是答案的一部分。我添加了每个文件的文件版本的循环。这增加了 1.5 GB 多一点,这是我认为的总数的很大一部分。我们的用户确实经常使用 sharepoint 版本。我已经编辑了帖子中的代码以反映这一点。
【解决方案3】:

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

【讨论】:

  • 在我最初的测试中,看起来附加到列表的项目是计数的一部分。我通过创建一个新的自定义列表对此进行了测试。然后我制作了一个新的空白项目,创建了一个 16mb 的 rtf 文件。然后我将该文件作为附件添加到空白项目中。当我在测试服务器上运行代码时,总计数增加了 16mb 的存储空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多