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 が呼び出されたと思いました。また、OpenBinary が機能するかどうかにかかわらず、file.CanOpenFile(true) は常に true を返すこともわかりました。
OpenBinary() を呼び出す前に、ファイルを開く準備ができていることを確認するにはどうすればよいですか? Thread.Sleep ソリューションは好きではありません。ファイルが大きくなったり、サーバーがビジー状態になったりすると、より多くの待機が必要になるからです。所要時間は予測できず、ループして永遠に再試行したくありません。
更新: 当初、開けないのは大きなファイルが原因だと思っていました。原因としてエクスプローラー ビューを反映するように質問が更新されました。また、Windows エクスプローラーのコピーも ItemUpdated をトリガーし (2 回)、ここでファイルを開くことができます。3 つのトリガー、1 つのことを行うための 2 つの呼び出しがあるのは少し厄介なので、まだ提案を受け付けています。