Как я могу убедиться, что мои программные загрузки выполняются в правильном порядке? - PullRequest
0 голосов
/ 12 августа 2010

В нашем приложении мы храним две копии файла - утвержденную и неутвержденную. Оба отслеживают свои версии отдельно. Когда неутвержденное затем утверждается, все его версии добавляются как новые версии в утвержденный файл. Чтобы сделать это правильно, мой код должен загружать каждую версию отдельно в утвержденную папку и обновлять элемент каждый раз информацией об этой версии.

По какой-то причине, это не всегда работает должным образом. В моем последнем сценарии сначала была загружена последняя версия, а затем все остальные версии. Тем не менее, мой код явно должен загружать другие версии в первую очередь, это порядок, в котором я его написал. Почему это происходит? И если это возможно, как я могу обеспечить загрузку версий в правильном порядке?

Пояснение - Это не проблема с перечислением - я получаю предыдущие версии в правильном порядке. Происходит то, что окончательная версия, которая написана после цикла, загружается до цикла. Что на самом деле не имеет никакого смысла для меня.


Вот сокращенная версия соответствующего кода.

//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 голосов
/ 12 августа 2010

Я думаю, что коллекция item.File.Versions просто возвращает набор элементов и не возвращает их в любом гарантированном порядке.Вам будет лучше выгуливать их по порядку, чем пытаться foreach их и надеяться, что они придут в правильном порядке.Как вы уже поняли, они этого не делают.

0 голосов
/ 12 августа 2010

Почему бы не упростить код для использования "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);
}

Это должно затем обновиться в обратном порядке, причем первый элемент будет последним.

...