2016-03-14 44 views
0

我写了使用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:保存冲突。 您的更改与另一个用户同时完成的更改发生冲突。如果 您希望应用更改,请在您的Web浏览器中单击返回, 刷新页面,然后重新提交更改。 ---> System.Runtime.InteropServices.COMException:保存冲突。您的 更改与另一个用户同时发生冲突。

我猜测会发生这种情况,因为最后一个文件是在上载完其他文件之前上传的。

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

回答

0

这不正是我一直在想,但通过添加

<Synchronization>Synchronous</Synchronization> 

elements.xml解决了这个问题,使事件接收器的工作同步。我不会将这个标记为答案,因为我原先不想让这个事件接收器同步,而是等待其他事件,所以如果有人有更好的答案:请随意发布它)