Использование SPFile и SPFileCollection для обновления названий файлов в Sharepoint 2010

Привет всем. Сегодня хочу рассказать как можно легко создать событие по которому будет автоматически изменяться названия файлов в Вашей библиотеке документов.

Пример 1. Допустим Вы хотите сделать так, чтобы при создании элемента (документа) в Вашей библиотеке документов, элемент (файл) имел название в зависимости от того в какой он папке находится. Например, Есть иерархия папок – Папка1-Папка2-вложенные файлы. Так вот, если Вы создали документ, то он должен называться Папка1-Папка2-название документа.

Для решения этой задачи нам необходимо создать проект по шаблону EventReciever и выбрать в типе элемента библиотека документов, а в событиях отметить событие Создание элемента.

После генерации кода, Вам необходимо написать такой код:

public class EventReceiver1 : SPItemEventReceiver
    {
       /// <summary>
       /// An item was added.
       /// </summary>
       public override void ItemAdded(SPItemEventProperties properties)
       {
           base.ItemAdded(properties);

           SPFile file = properties.Web.GetFile(properties.ListItem.Url);
           if (file.Item.ContentType.Name == "Документ")
           {
               file.Item["Имя"] = properties.AfterUrl.Replace("/", "-");
               file.Item.Update();
           }
       }

}

В этом примере мы используем клас SPFile и его метод GetFile() для получения сведений о создаваемом документе. Также используем проверку на тип контента.

Далее нам необходимо как-то отслеживать изменения папок, чтобы автоматически менялись названия созданных документов. Это можно сделать с помощью отлавливания события изменений элементов.

Создаём событие и пишем такой код:

/// <summary>
      /// An item was updated
      /// </summary>
      public override void ItemUpdated(SPItemEventProperties properties)
      {
          base.ItemUpdated(properties);

          SPFile file = properties.Web.GetFile(properties.ListItem.Url);
          if (file.Item.ContentType.Name == "Папка")
          {

              SPFileCollection fileCollection = properties.Web.GetFolder(properties.ListItem.Url).Files;

              foreach (SPFile fileItem in fileCollection)
              {
                  fileItem.Item["Имя"] = fileItem.Item.Name + properties.AfterUrl.Replace("/", "-");
                  file.Item.Update();
              }
          }

      }

Здесь мы уже используем класс SPFileCollection и его метод GetFolder() для получения сведений о изменяемой папке документов. И после запускаем цикл на изменение всех документов в этой папке.

Видим, что всё очень просто. Есть ещё момент, если Вы хотите программно менять название папок, то Вам необходимо написать типа в таком виде:

SPFolder.Name = "NewFolderName";

SPFolder.MoveTo("brandspakningnewSPFolder.Name");