SharePoint получает размер отдельных веб-сайтов с помощью API - PullRequest
2 голосов
/ 01 марта 2010

Прямо сейчас все, что я использую для расчета размера, это файлы в папках. Я не думаю, что это все, потому что размер базы данных контента составляет около 15 ГБ. Когда я вычисляю размер всех файлов, я получаю около 10 ГБ. Кто-нибудь знает, чего мне не хватает?

Вот код, который у меня есть.

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 01.03.2010 cst Я добавил возможность подсчитывать версии файлов как часть размера в коде. Как было предложено Goyuix в посте ниже. Он все еще отключен значительным объемом физического размера базы данных.

edit 8:38 am 3/3/2010 cst Я добавил в расчет размера корзины для каждой сети и корзину для семейства сайтов. Эти изменения были предложены ArjanP. Также я хотел бы добавить, что я очень открыт для более эффективных способов сделать это.

Ответы [ 3 ]

2 голосов
/ 03 марта 2010

Вы рассматривали мусорное ведро? Там будут банки для веб-сайтов и семейства сайтов, и все они будут занимать место в базе данных контента.

В базе данных контента всегда будут «накладные расходы». Каждая «пустая» сеть уже будет занимать несколько байтов. 30% кажется большим, но не чрезмерным, это зависит от соотношения контента и количества веб-сайтов.

1 голос
/ 01 марта 2010

Я не совсем уверен, что ваш код также учитывает вложения в списках.

1 голос
/ 01 марта 2010

База данных контента также хранит информацию о конфигурации, например, какие списки действительно существуют, функции, разрешения и т. Д. ... хотя это, вероятно, не учитывает 5 ГБ данных, это то, что нужно учитывать. Кроме того, каждый файл также обычно ассоциируется с SPListItem, который может содержать метаданные для этого файла.

Включено ли управление версиями для каких-либо списков / библиотек? В этом случае вам также необходимо проверить свойство SPListItem.Versions для каждой версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...