jueves, 5 de febrero de 2009

Copiar items y folders entre DocumentLibrary manteniendo sus campos

Me he encontrado en un proyecto en que unas librerías de sharepoint que fueron migradas de 2003 daban un error al intentar mover elementos usando el sitemanger. Vimos que esto no pasaba en las otras librerías por lo que tuvimos que hacer un script para mover documentos y folders de una librería a otra, eso sí manteniendo todos sus metadatos, aquí algunos de los pasos que hemos seguido:

1. Igualar los campos de las bibliotecas:


public static void IgualarCampos(SPDocumentLibrary origen, SPDocumentLibrary destino)
{
if (origen == null destino == null) throw new ArgumentException("Las bibliotecas destino y origen no pueden ser nulas");
try
{
List listaCamposDestino = new List();
foreach (SPField field in destino.Fields)
{
listaCamposDestino.Add(field);
}
// Compara con origen y crea las necesarias en destino
foreach (SPField field in origen.Fields)
{
SPField campoBuscado = listaCamposDestino.Find(delegate(SPField campo)
{
return campo.Id == field.Id;
});
// Si no existe lo añadimos
if (campoBuscado == null )
{
// Se crea campo en lista destino.
destino.Fields.Add(field);
}
}
}
catch (Exception ex)
{
throw ex;
}
}



2. Funciones recursivas para recorrer todos los folders y crearlos en el destino así como los items por folder:



public static void CopyFoldersAndItems(SPDocumentLibrary origen, SPDocumentLibrary destino)
{
if (origen == null destino == null) throw new ArgumentException("Las bibliotecas destino y origen no pueden ser nulas");
try
{
string urldestinofolders = destino.RootFolder.ServerRelativeUrl.ToString();
SPFolderCollection foldersdestino = destino.ParentWeb.GetFolder(urldestinofolders).SubFolders;
string urlorigenfolders = origen.RootFolder.ServerRelativeUrl.ToString();
SPFolderCollection foldersorigen = origen.ParentWeb.GetFolder(urlorigenfolders).SubFolders;
foreach (SPFile file in origen.RootFolder.Files)
{
SPFile newFile = destino.RootFolder.Files.Add(file.Name, file.OpenBinary(), file.Author, file.ModifiedBy, file.TimeCreated, file.TimeLastModified);
SPListItem newItem = newFile.Item;
foreach (SPField f in file.Item.Fields)
{
if (!f.ReadOnlyField) newItem[f.InternalName] = file.Item[f.InternalName];
}
newItem["Modificado"] = file.TimeLastModified;
newItem["Creado"] = file.TimeCreated;
newItem.UpdateOverwriteVersion();
}
CopyFoldersAndItems(foldersorigen, foldersdestino);
}
catch (Exception ex)
{
throw ex;
}
}
public static void CopyFoldersAndItems(SPFolderCollection origen, SPFolderCollection destino)
{
try
{
foreach (SPFolder folder in origen)
{
if (folder.Name != "Forms")
{
SPFolder nuevo = destino.Add(folder.Name);
foreach (SPFile file in folder.Files)
{
SPFile newFile = nuevo.Files.Add(file.Name, file.OpenBinary(), file.Author, file.ModifiedBy, file.TimeCreated, file.TimeLastModified);
SPListItem newItem = newFile.Item;
foreach (SPField f in file.Item.Fields)
{
if(!f.ReadOnlyField) newItem[f.InternalName] = file.Item[f.InternalName];
}
newItem["Modificado"] = file.TimeLastModified;
newItem["Creado"] = file.TimeCreated;
newItem.UpdateOverwriteVersion();
}
if (folder.SubFolders.Count > 0) CopyFoldersAndItems(folder.SubFolders, nuevo.SubFolders);
}
}
}
catch (Exception ex)
{
throw ex;
}
}


1 comentario:

Anónimo dijo...

Hola,

gracias por tu aporte, muy interesante.

¿Sabrias como mantener los permisos de los documentos si esta la herencia rota y son personalizados?