2010-08-11 72 views
0

在我们的应用程序中,我们存储了两个文件副本 - 一个批准文件和一个未批准文件。两者分别跟踪他们的版本。当未批准的文件被批准后,其所有版本都将作为新版本添加到批准的文件中。为了做到这一点,我的代码必须将每个版本分别上传到批准的文件夹中,并且每次使用该版本的信息更新该项目。如何确保我的程序上传按正确的顺序完成?

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

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


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

//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

为什么不简化使用的代码“为”而不是“的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); 
} 

这应该然后以相反的顺序更新,第一个项目是最后一个。

+0

SPFile.Versions按相反顺序存储,不包含最新版本;最新版本是SPFile本身。 – 2010-08-11 20:14:41

+0

这确实解释了为什么您必须单独执行UpdateField,并且现在我会看到代码是如何变化的。 如果所有的代码都是在单个线程中执行的,那么您原本应该按照您指定的方式工作。 但是,您所描述的行为表明UpdateFields方法中的代码正在后台线程中工作,这将阻止对订单的任何控制。您可能需要查看UpdateFields的代码,以确保它与主代码在同一线程中运行。 – Russ 2010-08-12 12:39:15

0

我认为item.File.Versions集合只是返回一堆物品,并没有以任何保证的顺序返回它们。你会更好地走他们,以明确地比尝试foreach他们,并希望他们按正确的顺序进来。正如你已经知道的那样,他们没有。

+0

我已经更新了这个问题来正确地澄清问题。 SPFile.Versions枚举正确,这不是问题所在。 – 2010-08-11 20:44:20