如何确保以正确的顺序完成程序化上传?

时间:2010-08-11 20:00:18

标签: c# sharepoint file-upload

在我们的应用程序中,我们存储了两个文件副本 - 一个已批准的文件和一个未批准的文件。两者都分别跟踪他们的版本当未批准的版本获得批准后,其所有版本都将作为新版本添加到批准的文件中。为了正确执行此操作,我的代码必须将每个版本单独上载到批准的文件夹中,并且每次使用该版本的信息更新项目。

但出于某种原因,这并不总是正常。在我的最新版本中,首先上载了最新版本,然后上传了所有剩余版本。但是,我的代码显然应该首先上传其他版本,这就是我写的顺序。为什么会发生这种情况?如果可能,我如何确保以正确的顺序上传版本?

澄清 - 这不是枚举的问题 - 我正在以正确的顺序获得以前的版本。发生的事情是在循环之后上传的最终版本正在循环之前上传。这对我来说真的没有任何意义。


以下是相关代码的精简版。

//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();

2 个答案:

答案 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 他们并希望他们按照正确的顺序行事。正如你已经想到的那样,他们没有。