2016-03-14 75 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解決了這個問題,使事件接收器的工作同步。我不會將這個標記爲答案,因爲我原先不想讓這個事件接收器同步,而是等待其他事件,所以如果有人有更好的答案:請隨意發佈它)