Cuando creo una carpeta mediante programación aparece el error "Datos de elemento no válidos: falta FileRef"

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

  •  09-12-2019
  •  | 
  •  

Pregunta

Estoy intentando agregar mediante programación la carpeta deseada.hago lo siguiente

foreach (SPListItem reparto in reparti.Items)
{
  var folder = dl.Items.Add(dl.RootFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder);
  folder["Title"] = "Test";
  folder.Update();
}

Pero recibo el siguiente error al actualizar: Invalid item data -- missing FileRef

¿Por qué?

¿Fue útil?

Solución

Si desea crear una carpeta, debe especificar su nombre en el leafName parámetro.cambia tu código a:

foreach (SPListItem reparto in reparti.Items)
{
     var folder = dl.Items.Add(
          dl.RootFolder.ServerRelativeUrl, 
          SPFileSystemObjectType.Folder, 
          "Test"
          );

     folder.Update();
}

Si puede ayudar, aquí hay un pequeño método de utilidad que escribí para crear una jerarquía de carpetas completa:

/// <summary>
/// Provide utilities methods related to folder management
/// </summary>
public static class SPFolderUtilities
{
    /// <summary>
    /// Ensures the specified folder exists.
    /// </summary>
    /// <param name="list">The list where to create the folder.</param>
    /// <param name="subFolderPath">The sub folder path.</param>
    /// <returns>
    /// The existing <see cref="SPFolder"/> or a newly created if it did not exists.
    /// </returns>
    public static SPFolder EnsureFolder(SPList list, string subFolderPath)
    {
        Contract.Requires<ArgumentNullException>(list != null);
        Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(subFolderPath));
        if (!IO.SPPathUtilities.IsFileOrFolderNameValid(subFolderPath, true))
        {
            throw new ArgumentException("Invalid characters in the file or folder name", "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;
    }
}

Otros consejos

Otra versión de cómo crear una carpeta que incluye carpetas anidadas usando SharePoint SSOM.

Cómo crear una carpeta anidada utilizando SharePoint SSOM
internal static class SPFolderExtensions
{
    /// <summary>
    /// Ensure SPFolder
    /// </summary>
    /// <param name="web"></param>
    /// <param name="listTitle"></param>
    /// <param name="folderUrl"></param>
    /// <returns></returns>
    public static SPFolder CreateFolder(this SPWeb web, string listTitle, string folderUrl)
    {
        if (string.IsNullOrEmpty(folderUrl))
            throw new ArgumentNullException("folderUrl");
        var list = web.Lists.TryGetList(listTitle);
        return CreateFolderInternal(list, list.RootFolder, folderUrl);
    }


    private static SPFolder CreateFolderInternal(SPList list, SPFolder parentFolder, string folderUrl)
    {
        var folderNames = folderUrl.Split(new char[] {'/'}, StringSplitOptions.RemoveEmptyEntries);
        var folderName = folderNames[0];

        var curFolder =
            parentFolder.SubFolders.Cast<SPFolder>()
                        .FirstOrDefault(
                            f =>
                            System.String.Compare(f.Name, folderName, System.StringComparison.OrdinalIgnoreCase) ==
                            0);
        if (curFolder == null)
        {
            var folderItem = list.Items.Add(parentFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder,
                                            folderName);
            folderItem.SystemUpdate();
            curFolder = folderItem.Folder;
        }


        if (folderNames.Length > 1)
        {
            var subFolderUrl = string.Join("/", folderNames, 1, folderNames.Length - 1);
            return CreateFolderInternal(list, curFolder, subFolderUrl);
        }
        return curFolder;
    }
}

Puntos clave:

  • Posibilidad de crear una carpeta (s) anidada Las carpetas existentes
  • no se verán afectadas por

    Uso

    El siguiente ejemplo demuestra cómo crear la siguiente estructura de carpetas en la biblioteca Documents:

    Orders
       |
       Orders A
          |
          Orders A1
    

    Ejemplo:

    var folder = web.CreateFolder("Documents", "Orders3/Orders A/Orders A1");
    

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