在我们的应用程序中,我们存储了两个文件副本 - 一个已批准的文件和一个未批准的文件。两者都分别跟踪他们的版本当未批准的版本获得批准后,其所有版本都将作为新版本添加到批准的文件中。为了正确执行此操作,我的代码必须将每个版本单独上载到批准的文件夹中,并且每次使用该版本的信息更新项目。
但出于某种原因,这并不总是正常。在我的最新版本中,首先上载了最新版本,然后上传了所有剩余版本。但是,我的代码显然应该首先上传其他版本,这就是我写的顺序。为什么会发生这种情况?如果可能,我如何确保以正确的顺序上传版本?
澄清 - 这不是枚举的问题 - 我正在以正确的顺序获得以前的版本。发生的事情是在循环之后上传的最终版本正在循环之前上传。这对我来说真的没有任何意义。
以下是相关代码的精简版。
//These three are initialized earlier in the code.
SPList list; //The document library
SPListItem item; //The list item in the Unapproved folder
int AID; //The item id of the corresponding item in the Approved folder.
byte[] contents; //Not initialized.
/* These uploads are happening second when they should happen first. */
if (item.File.Versions.Count > 0)
{
//This loop is actually a separate method call if that matters.
//For simplicity I expanded it here.
foreach (SPFileVersion fVer in item.File.Versions)
{
if (!fVer.IsCurrentVersion)
{
contents = fVer.OpenBinary();
SPFile fSub = aFolder.Files.Add(fVer.File.Name, contents, u1, fVer.CreatedBy, dt1, fVer.Created);
SPListItem subItem = list.GetItemById(AID);
//This method updates the newly uploaded version with the field data of that version.
UpdateFields(item.Versions.GetVersionFromLabel(fVer.VersionLabel), subItem);
}
}
}
/* This upload happens first when it should happen last. */
//Does the same as earlier loop, but for the final version.
contents = item.File.OpenBinary();
SPFile f = aFolder.Files.Add(item.File.Name, contents, u1, u2, dt1, dt2);
SPListItem finalItem = list.GetItemById(AID);
UpdateFields(item.Versions[0], finalItem);
item.Delete();
答案 0 :(得分:0)
为什么不简化使用“for”代替“foreach”的代码:
for (int i = item.File.Versions.Count - 1; i >= 0; i--)
{
contents = item.File.Versions[i].OpenBinary();
SPFile f = aFolder.Files.Add(item.File.Versions[i].File.Name, contents, u1, item.File.Versions[i].CreatedBy, dt1, item.File.Versions[i].Created);
SPListItem subItem = list.GetItemByID(AID);
UpdateFields(item.Versions.GetVersionFromLabel(item.File.Versions[i].VersionLabel), subItem);
}
然后应该以相反的顺序更新,第一项是最后一项。
答案 1 :(得分:0)
我认为item.File.Versions集合只返回一堆项目,并且不会以任何保证顺序返回它们。你最好明确地按顺序走他们,而不是试图 foreach 他们并希望他们按照正确的顺序行事。正如你已经想到的那样,他们没有。