Quando eu crio uma pasta programaticamente, recebo o erro “Dados de item inválidos – faltando FileRef”

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

  •  09-12-2019
  •  | 
  •  

Pergunta

Estou tentando adicionar programaticamente a pasta desejada.Eu faço o seguinte

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

Mas recebo o seguinte erro na atualização: Invalid item data -- missing FileRef

Por que?

Foi útil?

Solução

Se você deseja criar uma pasta, você deve especificar seu nome no campo leafName parâmetro.mude seu código para:

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

     folder.Update();
}

Se puder ajudar, aqui está um pequeno método utilitário que escrevi para criar uma hierarquia de pastas 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;
    }
}

Outras dicas

Mais uma versão de como criar uma pasta incluindo pastas aninhadas usando o SharePoint SSOM.

Como criar uma pasta aninhada usando o 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;
    }
}

Pontos chave:

  • Capacidade de criar pastas aninhadas
  • As pastas existentes não serão afetadas

Uso

O exemplo abaixo demonstra como criar a seguinte estrutura de pastas em Documents biblioteca:

Orders
   |
   Orders A
      |
      Orders A1

Exemplo:

var folder = web.CreateFolder("Documents", "Orders3/Orders A/Orders A1");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top