1

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 つの呼び出しがあるのは少し厄介なので、まだ提案を受け付けています。

4

2 に答える 2

0

SP2010 と SP2013 で同じ問題に直面しています。これを解決する方法はありますか?

どういうわけか、これはより大きなファイルと関係があります。小さなファイルは問題なく動作しますが、大きなファイル (400kb) は常に動作するとは限りません。

1つだけヒントがあります。Windows エクスプローラー (WebDAV) でファイルをコピーしてライブラリーに貼り付けると、ファイルが作成されるとすぐに EventHandle (ItemAdded) がトリガーされます。しかし、これはファイルがすでにデータで満たされているという意味ではありません。これを一度見たことがありますが、ウィンドウがまだコピープロセスでビジー状態であるにもかかわらず、デバッガーがブレークポイントにヒットしました。

コピープロセスがいつ終了するかを知ることは素晴らしいことです。「spfile.openBinary()」を実行するだけでこれを実行できると思いました。空の場合は、2秒待ってから、0バイトよりも大きくなるまでもう一度実行します。しかし、これはうまくいきません!初めて openBinary() を呼び出す前に待機している場合にのみ機能し、それ以外の場合はすべて openBinary() を呼び出しても同じ結果になります。

于 2013-03-28T13:18:13.780 に答える