У меня есть получатель событий, связанный с библиотекой изображений SharePoint 2010.Когда изображение загружено, я хочу открыть его для обработки.Файлы, загруженные через веб-интерфейс, работают нормально, но файлы, скопированные с помощью проводника 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 Explorer также вызывает ItemUpdated (дважды), и я могу открыть файл здесь.Немного грязно иметь 3 триггера, 2 звонка, чтобы сделать 1 вещь, так что я все еще открыт для предложений.