Hi @Tong Zhang_MSFT
I am writing this as an answer as comments do not allow many characters. Here's my entire code for the function. As you can see, I am not having two references for a single list item and I am just trying to add the file using SPDocumentLibrary.RootFolder.Files.Add.
public static void MoveFileWithVersions(string sourceSite, string sourceLib, string destSite, string destLib, int id)
{
using (SPSite site = new SPSite(sourceSite))
{
using (SPWeb web = site.RootWeb)
{
SPList libSource = web.Lists[sourceLib];
SPFileCollection fileCollection = libSource.RootFolder.Files;
SPListItem item = libSource.GetItemById(id);
SPFile fileSource = item.File;
SPUser userCreatedBy = web.EnsureUser(Settings.DefaultUser);
try
{
userCreatedBy = fileSource.Author;
}
catch (Exception)
{
userCreatedBy = web.EnsureUser(Settings.DefaultUser);
}
DateTime dateCreatedOn = fileSource.TimeCreated;
//Get the versions
int countVersions = fileSource.Versions.Count;
for (int i = 0; i < countVersions; i++)
{
Hashtable hashSourceProp;
Stream streamFile;
SPUser userModifiedBy;
DateTime dateModifiedOn;
string strVerComment = "";
bool boolMajorVer = false;
int itemId = 0;
SPFileVersion fileSourceVer = fileSource.Versions[i];
//Console.WriteLine("Working with version: "+fileSource.Versions[i].VersionLabel);
hashSourceProp = fileSourceVer.Properties;
SPUser modifiedBy = userCreatedBy;
try
{
modifiedBy = fileSourceVer.CreatedBy;
}
catch (Exception)
{
// Do nothing
}
if (i < countVersions)
{
userModifiedBy = (i == 0) ? userCreatedBy : modifiedBy;
dateModifiedOn = fileSourceVer.Created;
strVerComment = fileSourceVer.CheckInComment;
boolMajorVer = fileSourceVer.VersionLabel.EndsWith("0") ? true : false; // Major or Minor
}
else
{
userModifiedBy = modifiedBy;
//I modify the modified time for the current version
//dateModifiedOn = fileSource.TimeCreated.ToLocalTime();
dateModifiedOn = fileSource.TimeLastModified;
hashSourceProp = fileSource.Properties;
strVerComment = fileSource.CheckInComment;
boolMajorVer = fileSource.MinorVersion == 0 ? true : false;
}
streamFile = fileSource.OpenBinaryStream();
itemId = fileSource.Item.ID;
// Connect to the destination.
using (SPSite destnationSite = new SPSite(destSite))
{
using (SPWeb dWeb = destnationSite.RootWeb)
{
SPUser userCreatedByDest = dWeb.EnsureUser(Settings.DefaultUser);
try
{
userCreatedByDest = dWeb.EnsureUser(userCreatedBy.Name);
}
catch (Exception)
{
userCreatedByDest = dWeb.EnsureUser(Settings.DefaultUser);
}
SPUser userModifiedByDest = dWeb.EnsureUser(Settings.DefaultUser);
try
{
userCreatedByDest = dWeb.EnsureUser(userCreatedBy.Name);
}
catch (Exception)
{
userCreatedByDest = dWeb.EnsureUser(Settings.DefaultUser);
}
SPDocumentLibrary libDest = (SPDocumentLibrary)dWeb.Lists[destLib];
string urlDestFile = fileSource.Url;
Console.WriteLine("urlDest: "+urlDestFile);
SPFile fileDest = libDest.RootFolder.Files.Add(
urlDestFile,
streamFile,
hashSourceProp,
userCreatedByDest,
userModifiedByDest,
dateCreatedOn,
dateModifiedOn,
strVerComment,
true);
Console.WriteLine("fileDest.Url: "+fileDest.Url);
//Console.WriteLine("serverRelativeUrl: "+fileDest.ServerRelativeUrl);
if (boolMajorVer)
{
libDest.EnableMinorVersions = true;
libDest.Update();
fileDest.Publish(strVerComment);
libDest.EnableMinorVersions = false;
libDest.Update();
fileDest.Item["Created"] = dateCreatedOn;
fileDest.Item["Created By"] = userCreatedByDest;
fileDest.Item["Modified"] = dateModifiedOn;
fileDest.Item["Modified By"] = userModifiedByDest;
//fileDest.Item["SourceID"] = itemId;
//fileDest.Item["ReadyToArchive"] = false;
fileDest.Item.UpdateOverwriteVersion();
//fileDest.Item[SPBuiltInFieldId.ID] = itemId;
libDest.EnableMinorVersions = true;
libDest.DraftVersionVisibility = Microsoft.SharePoint.DraftVisibilityType.Reader;
//fileDest.Item[SPBuiltInFieldId.ID] = itemId;
SPListItem it = fileDest.Item;
Console.WriteLine("Got the item...");
fileDest.Item.ID = itemId;
it.ID = itemId;
it.Update();
//Console.WriteLine("Updated teh current ID to: "+itemId);
libDest.Update();
web.Update();
//Console.WriteLine("UpdatING the MAJOR version...");
}
else
{
SPListItem itmNewVersion = fileDest.Item;
itmNewVersion["Created"] = dateCreatedOn;
itmNewVersion["Created By"] = userCreatedByDest;
itmNewVersion["Modified"] = dateModifiedOn;
itmNewVersion["Modified By"] = userModifiedByDest;
//fileDest.Item["SourceID"] = itemId;
Console.WriteLine("Got the item...");
//itmNewVersion["ReadyToArchive"] = false;
itmNewVersion.SystemUpdate();
//fileDest.Item[SPBuiltInFieldId.ID] = itemId;
//Console.WriteLine("UpdatING the minor version...");
}
//Console.WriteLine("Updated: "+libDest.Title);
}
}
}
}
}
}
The error is thrown exactly when line #96 is hit.
Thanks.