2015-09-23 2 views
0

Ниже приведен фрагмент кода, я довольно много нового SharepointФайл не получает удален из библиотеки Sharepoint

using (SPSite site = new SPSite(spSiteGUID)) 
{ 
     using (SPWeb web = site.OpenWeb(spWebGUID)) 
     { 
      SPList list = web.Lists["Folder Name"]; 
      string sQuery = "<Where><BeginsWith><FieldRef Name='NameOrTitle'/><Value Type='Text'>" + fileName + "</Value></BeginsWith></Where>"; 
      var oQuery = new SPQuery(); 
      oQuery.Query = sQuery; 
      oQuery.ViewAttributes = @"Scope='Recursive'"; 
      SPListItemCollection collListItems = list.GetItems(oQuery); 

      foreach (SPListItem oListItem in collListItems) 
      { 
       //file.UndoCheckOut(); 
       //file.CheckOut(); 
       oListItem.File.UndoCheckOut(); 
       oListItem.File.CheckOut(); 

       oListItem.Delete();     

      } 
     } 

Предназначен файл для удаления становится идентифицирован. Все работает нормально до последней строки, которая является oListItem.Delete(); , oListItem содержит правильное имя файла, но по какой-то причине удаление не происходит. Я не вижу никаких ошибок. Я очень новичок в sharepoint, поэтому не могу много добавить к этому сообщению.

ответ

0
foreach (SPListItem oListItem in collListItems) 
{ 
    //file.UndoCheckOut(); 
    //file.CheckOut(); 
    oListItem.File.UndoCheckOut(); 
    oListItem.File.CheckOut(); 

    SPListItem itemToDelete = list.GetItemById(oListItem.Id); 
    itemToDelete.Delete(); 
} 
+0

В вашем подходе есть один большой недостаток. Сначала вы инициализируете 'collListItems' со всеми ListItems списка. Вы снова запрашиваете, чтобы один и тот же список ListItem возвращался из SP с помощью 'GetItemById()'. Поэтому каждый ListItem запрашивается дважды, прежде чем фактически будет удаляться, и время для всего процесса также будет возрастать экспоненциально. – Piyush

1

Я не знаю, почему вы не получили никаких ошибок! Но вы не можете перебирать SPListItemCollection (collListItems) и одновременно удалять свой элемент. Видите ли, цикл foreach внутренне вызывает GetEnumerator, который строго требует, чтобы коллекция оставалась в силе, т. Е. Нельзя изменять коллекцию при повторении. Здесь вы можете заменить foreach на цикл for:

for (int i = collListItems.Count-1; i>= 0; i--) 
{ 
    collListItems[i].File.UndoCheckOut(); 
    collListItems[i].File.CheckOut(); 
    collListItems[i].Delete(); 
} 
Смежные вопросы