У меня есть небольшое клиентское приложение на C #, которое отправляет изображения на сайт sharepoint через веб-сервис. Поскольку изображения могут быть довольно большими, мне нужно проверить, не изменились ли файлы, чтобы мне не нужно было отправлять файл снова.
Я проверяю, изменился ли файл, вычисляя, запрашивая MD5-хеш файла с сервера и сравнивая его с хэшем файла на клиенте.
Странно то, что этот подход работает с примерно 60% моих изображений, в остальном сервер возвращает другой хэш. Если я загружаю файл с sharepoint и заменяю локальный, то хеш совпадает.
Я также пытался с CRC32 с тем же результатом
Кто-нибудь знает, добавляет ли Sharepoint информацию в файлы изображений, когда они публикуются в стандартной библиотеке ресурсов.
Это функция, которую я использую для расчета MD5
protected string GetMD5HashFromFile(byte[] file)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
РЕДАКТИРОВАТЬ 1
Я сравнил исходный файл с файлом, опубликованным на sharepoint, и файлы идентичны, за исключением даты файла.
РЕДАКТИРОВАТЬ 2
уточнить
На клиенте я вычисляю хеш по
byte[] buff;
using (FileStream fs = System.IO.File.Open(filePath, FileMode.Open, FileAccess.Read))
{
buff = ConvertStreamToByteBuffer(fs);
}
public byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)
{
int b1;
System.IO.MemoryStream tempStream = new System.IO.MemoryStream();
while ((b1 = theStream.ReadByte()) != -1)
{
tempStream.WriteByte(((byte)b1));
}
return tempStream.ToArray();
}
А потом
string md5Local = GetMD5HashFromFile(buff);
На сервере я просто собираю список элементов с помощью CAML-запроса и затем вычисляю
string Md5 = GetMD5HashFromFile(oSPListItemCollection[0].File.OpenBinary());