delete - grothauser/sharepointsnippets GitHub Wiki
private void SolveConflict(SPList sourceLibrary, SPWeb web, SPList destLibrary, SPListItem sourceFolder, SPList companiesInDestLib, String companyMainName, SPListItemCollection destFolders) {
SPFileCollection destinationFileColletion = destFolders[0].Folder.Files;
List<SPFile> destinationFiles = ToList(destinationFileColletion);
SPFileCollection sourceFileColletion = sourceFolder.Folder.Files;
List<SPFile> sourceFiles = ToList(sourceFileColletion);
if (Replace.Checked) //replace whole project
{
ReplaceFolder(sourceLibrary, web, destLibrary, sourceFolder, companiesInDestLib, companyMainName, destFolders);
}
else if (MergeNewer.Checked)//means to just keep the newer one but merge missing files into
{
//get all files from destination folder and from sourcefolder
List<SPFile> duplicatedFilesToRemove = new List<SPFile>();
List<SPFile> duplicatedFilesToCopy = new List<SPFile>();
List<SPFile> remainingFiles = new List<SPFile>();
//look for files already in destination : !! TODO: check for category and date modified (properties?)
foreach(SPFile srcFile in sourceFiles)
{
//ist nur ein duplikat wenn category + subkategorie gleich sind
SPFile duplicateCandidate = destinationFiles.Find(destFile => destFile.Name == srcFile.Name);
SPFile duplicate = null; //will be deleted and replaced
if (duplicateCandidate != null)
{
//are all properties the same? => test for modified
if ((duplicateCandidate.Properties == srcFile.Properties) && duplicateCandidate.Item.Properties == srcFile.Item.Properties)
{
//is just the modified date different? => take the newer one
DateTime modifiedDest = new DateTime();
DateTime modifiedSrc = new DateTime();
DateTime.TryParse(duplicateCandidate.Item["Modified"].ToString(), out modifiedDest);
DateTime.TryParse(srcFile.Item["Modified"].ToString(), out modifiedSrc);
if (modifiedSrc != null && modifiedDest != null)
{
if (DateTime.Compare(modifiedDest, modifiedSrc) < 0)
{ //modified dest is earlier than modified src => src is the newer one
duplicatedFilesToRemove.Add(duplicateCandidate);
duplicatedFilesToCopy.Add(srcFile);
duplicate = duplicateCandidate;
}
else if (DateTime.Compare(modifiedDest, modifiedSrc) > 0)//modifiedDest is later than modifiedSrc => dest is the newer one, no need to copy srcFile
{
duplicate = srcFile;
}
}
}
}
if (duplicate == null)
{
remainingFiles.Add(srcFile);
}
}
web.AllowUnsafeUpdates = true;
//delete duplicates from destination
duplicatedFilesToRemove.ForEach(duplicateFile => destLibrary.Items.DeleteItemById(duplicateFile.Item.ID));
//copy duplicated files to destination
duplicatedFilesToCopy.ForEach(file =>
{
Hashtable properties = file.Properties;
SPFile result = destFolders[0].Folder.Files.Add(file.ServerRelativeUrl + "/" + file.Name, file.OpenBinary(), properties, true);
});
//copy all Other files (those who are not in duplicatedFilesToCopy
CopyLeftFiles(web, destFolders, remainingFiles);
//delete sourcefolder
sourceLibrary.Items.DeleteItemById(itemId);
}
else //means to keep both files, create an ending and merge missing files into
{
//get all files from destination folder and from sourcefolder
List<SPFile> duplicatedFilesToRenameDest = new List<SPFile>();
List<SPFile> filesLeft = new List<SPFile>();
//look for files already in destination
sourceFiles.ForEach(srcFile =>
{
SPFile duplicateToRename = destinationFiles.Find(destFile => destFile.Name == srcFile.Name && destFile.Properties == srcFile.Properties && destFile.Item.Properties == srcFile.Item.Properties);
if (duplicateToRename != null)
{
duplicatedFilesToRenameDest.Add(duplicateToRename);
}
else
{
filesLeft.Add(srcFile);
}
});
//rename duplicates from destination
duplicatedFilesToRenameDest.ForEach(duplicateFile =>
{
duplicateFile.CheckOut();
duplicateFile.Item["Name"] = duplicateFile.Item.Name + "_old";
duplicateFile.Item.Update();
duplicateFile.CheckIn("renamed by move to other library");
});
web.AllowUnsafeUpdates = true;
//copy all Other files (those who are not in duplicatedFilesToRenameSrc
CopyLeftFiles(web, destFolders, filesLeft);
//delete source folder
sourceLibrary.Items.DeleteItemById(itemId);
}
}