等待完成上传

时间:2016-03-14 12:57:58

标签: sharepoint file-upload event-receiver

我编写了一个程序,使用CSOM将多个文件写入SharePoint列表:

foreach (file in myFiles) {
  UploadFileToSharePoint(file.dataq, context, url+ file.name);
}
UploadFileToSharePoint(dummy, context, url+"finish.txt");
     public static void UploadFileToSharePoint(Byte[] fileStream, ClientContext cCtx, String destUrl)
        {
             using (MemoryStream stream = new MemoryStream(fileStream))
            {
                Microsoft.SharePoint.Client.File.SaveBinaryDirect(cCtx, destUrl, stream, true);
            }
        }

如您所见,将N个文件上传到目标文件夹后,会上传最后一个名为“finish.txt”的文件。现在,我有一个事件接收器,用于检查上一个文件是否已上传:

public override void ItemAdded(SPItemEventProperties properties)
        {
            try
            {
                if (properties.ListItem.FileSystemObjectType == SPFileSystemObjectType.File)
                {
                    if (properties.ListItem.File != null && properties.ListItem.File.ParentFolder != null)
                    {
                        if (properties.ListItem.File.Name.Contains("finish.txt"))
                        {
                            // last file inside folder
                            AnalyzeFolder(properties.ListItem);
                        }
                    }
                }
                base.ItemAdded(properties);
            }

我偶尔会收到错误

  

移动文件时出错:Microsoft.SharePoint.SPException:Save Conflict。   您的更改与另一个用户同时进行的更改冲突。如果   您希望应用更改,请在Web浏览器中单击“返回”,   刷新页面,然后重新提交更改。 --->   System.Runtime.InteropServices.COMException:保存冲突。您的   改变与另一个用户同时发生的冲突。

我的猜测是,这是因为最后一个文件是在上传其他文件之前上传的。

如何在上传最后一个文件之前确保所有上传完成以防止出现此错误?

1 个答案:

答案 0 :(得分:0)

这不是我想要的,但通过添加

使事件接收器同步工作
<Synchronization>Synchronous</Synchronization>

elements.xml解决了这个问题。

(我不会将此标记为答案,因为最初我不想同时拥有该事件接收器,而是等待其他事件。所以如果有人有更好的答案:随意发布它)