Sergey Belskiy Technical Blog

All about SharePoint

Использование 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”);