Cuando creo una carpeta mediante programación aparece el error "Datos de elemento no válidos: falta FileRef"
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é?
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;
}
}
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
No afiliado a sharepoint.stackexchange