我有一个绑定到 SharePoint 2010 图片库的事件接收器。上传图片后,我想打开它进行处理。使用 Web 界面上传的文件工作正常,但通过 Windows 资源管理器视图复制的文件返回零字节。下面的简化代码。
public override void ItemAdded(SPItemEventProperties properties)
{
SPListItem item = properties.ListItem;
SPFile file = item.File;
byte[] buffer = file.OpenBinary(); //buffer has zero bytes for files copied in Windows Explorer!
}
如果我在打开之前插入延迟,它会起作用。
public override void ItemAdded(SPItemEventProperties properties)
{
SPListItem item = properties.ListItem;
SPFile file = item.File;
System.Threading.Thread.Sleep(2000);
byte[] buffer = file.OpenBinary(); //buffer now populated correctly
}
但我认为 ItemAdded 仅在一切完成后才被调用,包括文件上传。我还发现 file.CanOpenFile(true) 总是返回 true,无论 OpenBinary 是否有效。
在调用 OpenBinary() 之前,如何确保文件已准备好打开?我不喜欢 Thread.Sleep 解决方案,因为我确信更大的文件或更繁忙的服务器需要更多的等待。所需的时间无法预测,我不想永远循环再试一次。
更新:我原本以为打开失败是因为文件比较大。问题已更新,以反映资源管理器的观点作为原因。我还发现 Windows 资源管理器副本也会触发 ItemUpdated(两次),我可以在此处打开文件。有 3 个触发器,2 个调用做 1 件事有点混乱,所以我仍然愿意接受建议。