Un elemento de una carpeta no es devuelto por Subcarpeta propiedades después de su creación

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/40636

  •  09-12-2019
  •  | 
  •  

Pregunta

Tengo una lista de SharePoint (no una biblioteca), que aceptar la creación de carpetas.

He escrito una pequeña utilidad método que me permite crear una jerarquía de carpetas si todavía no existe :

    public static SPFolder EnsureFolder(SPList list, string subFolderPath)
    {
        var folderPaths = subFolderPath.Split('/');

        var currentFolder = list.RootFolder;
        for (int i = 0; i < folderPaths.Length; i++)
        {
            var subFolder = currentFolder.SubFolders.Cast<SPFolder>().FirstOrDefault(f => f.Name == folderPaths[i]);
            if (subFolder == null)
            {                   
                var newFolderItem = list.Items.Add(currentFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder, folderPaths[i]);
                newFolderItem.Update();
                currentFolder.Update();
                subFolder = newFolderItem.Folder;
                list.Update();
            }
            currentFolder = subFolder;
        }
        return currentFolder;
    }

Este código está trabajando en el primer tiempo, pero si he hecho dos llamadas sucesivas, se produce un error :

var myList = web.Lists["some list"];
EnsureFolder(myList, "folder");
EnsureFolder(myList, "folder"); // same as 1st call

El segundo llamadas produce un error en la línea :

newFolderItem.Update();

con este error :

Un fichier ou un dossier nommé http://server/sites/coll/wen/Lists/somelist/folder existe déjà.     at Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)
   at Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bPreserveItemUIVersion, Boolean bUpdateNoVersion, Int32& plID, String& pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object& pvarAttachmentNames, Object& pvarAttachmentContents, Object& pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bMigration, Boolean bPublish, String bstrFileName, ISP2DSafeArrayWriter pListDataValidationCallback, ISP2DSafeArrayWriter pRestrictInsertCallback, ISP2DSafeArrayWriter pUniqueFieldCallback)
   at Microsoft.SharePoint.SPListItem.AddOrUpdateItem(Boolean bAdd, Boolean bSystem, Boolean bPreserveItemVersion, Boolean bNoVersion, Boolean bMigration, Boolean bPublish, Boolean bCheckOut, Boolean bCheckin, Guid newGuidOnAdd, Int32& ulID, Object& objAttachmentNames, Object& objAttachmentContents, Boolean suppressAfterEvents, String filename, Boolean bPreserveItemUIVersion)
   at Microsoft.SharePoint.SPListItem.UpdateInternal(Boolean bSystem, Boolean bPreserveItemVersion, Guid newGuidOnAdd, Boolean bMigration, Boolean bPublish, Boolean bNoVersion, Boolean bCheckOut, Boolean bCheckin, Boolean suppressAfterEvents, String filename, Boolean bPreserveItemUIVersion)
   at Microsoft.SharePoint.SPListItem.Update()
   at somewhere in my project

Esto puede ser traducido como "Una carpeta XXX ya existe".

Cuando la depuración, puedo ver que var subFolder = currentFolder.SubFolders.Cast<SPFolder>().FirstOrDefault(f => f.Name == folderPaths[i]); se siempre devolver null.Parece que las Subcarpetas de la propiedad no está actualizada.

¿Qué tengo que hacer para corregir mi código ?Estoy llamando a la secuencia correcta de .Update() las llamadas?

¿Fue útil?

Solución

He encontrado una solución sencilla.

Reescribí el método como este :

public static SPFolder EnsureFolder(SPList list, string subFolderPath)
{
    var folderPaths = subFolderPath.Split('/');

    var currentFolder = list.RootFolder;
    for (int i = 0; i < folderPaths.Length; i++)
    {
        currentFolder = list.ParentWeb.GetFolder(currentFolder.Url); // hacky refresh
        var subFolder = currentFolder.SubFolders.Cast<SPFolder>().FirstOrDefault(f => string.Compare(f.Name, folderPaths[i], true) == 0);
        if (subFolder == null)
        {
            var newFolderItem = list.Items.Add(currentFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder, folderPaths[i]);
            newFolderItem.SystemUpdate();

            subFolder = newFolderItem.Folder;
        }
        currentFolder = subFolder;
    }
    return currentFolder;
}

El truco está en esta línea :

 currentFolder = list.ParentWeb.GetFolder(currentFolder.Url); // hacky refresh

Esta línea realmente volver a cargar la carpeta, en lugar de confiar en el sin embargo, los datos cargados.

No sé si esto tendrá efectos secundarios, pero se solucionó mi problema.

Licenciado bajo: CC-BY-SA con atribución
scroll top