我编写了一个程序,使用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:保存冲突。您的 改变与另一个用户同时发生的冲突。
我的猜测是,这是因为最后一个文件是在上传其他文件之前上传的。
如何在上传最后一个文件之前确保所有上传完成以防止出现此错误?
答案 0 :(得分:0)
这不是我想要的,但通过添加
使事件接收器同步工作<Synchronization>Synchronous</Synchronization>
到elements.xml
解决了这个问题。
(我不会将此标记为答案,因为最初我不想同时拥有该事件接收器,而是等待其他事件。所以如果有人有更好的答案:随意发布它)