Как узнать md5 файла в хранилище, не загружая его из Vault?

Автор Тема: Как узнать md5 файла в хранилище, не загружая его из Vault?  (Прочитано 690 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 11
  • Skype: pashin.evgeniy
Добрый день, коллеги.
Ищу ответ на довольно простой вопрос: как узнать контрольную сумму файла в хранилище, не загружая его на компьютер из хранилища, чтобы затем сравнить его с контрольной суммой файла на компьютере?
Или как определить cksum файла на локальном компьютере, чтобы сравнить его с cksum файла в хранилище?
« Последнее редактирование: 07-11-2017, 11:57:42 от Пашин Евгений »

Отмечено как Решение Пашин Евгений 07-11-2017, 11:41:31

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 11
  • Skype: pashin.evgeniy
Оказалось, всё довольно просто.

Чтобы сравнить два файла между собой (на локальном компьютере и в хранилище Vault) используется контрольная сумма общего назначения (CRC). Файл в хранилище Vault имеет свойство CkSum. Для того, чтобы сравнить два файла между собой - можно найти CheckSumm для локального файла. Корректно работающего кода на VB.NET я не нашёл, пришлось перепилить его с C# с некоторой доработкой:

Код - vb.net [Выбрать]
  1. Public Class CheckSumm
  2.     ' Проверка суммы CRC
  3.     '
  4.     Private Const m_chunkSize As Integer = 16384
  5.     ' Кто бы мог объяснить что это за коды???
  6.     Private Shared m_crc_32_tab As UInteger() = {&H0, &H77073096, &HEE0E612CUI, &H990951BAUI, &H76DC419, &H706AF48F, &HE963A535UI, &H9E6495A3UI, &HEDB8832, &H79DCB8A4, &HE0D5E91EUI, &H97D2D988UI, &H9B64C2B, &H7EB17CBD, &HE7B82D07UI, &H90BF1D91UI, &H1DB71064, &H6AB020F2, &HF3B97148UI, &H84BE41DEUI, &H1ADAD47D, &H6DDDE4EB, &HF4D4B551UI, &H83D385C7UI, &H136C9856, &H646BA8C0, &HFD62F97AUI, &H8A65C9ECUI, &H14015C4F, &H63066CD9, &HFA0F3D63UI, &H8D080DF5UI, &H3B6E20C8, &H4C69105E, &HD56041E4UI, &HA2677172UI, &H3C03E4D1, &H4B04D447, &HD20D85FDUI, &HA50AB56BUI, &H35B5A8FA, &H42B2986C, &HDBBBC9D6UI, &HACBCF940UI, &H32D86CE3, &H45DF5C75, &HDCD60DCFUI, &HABD13D59UI, &H26D930AC, &H51DE003A, &HC8D75180UI, &HBFD06116UI, &H21B4F4B5, &H56B3C423, &HCFBA9599UI, &HB8BDA50FUI, &H2802B89E, &H5F058808, &HC60CD9B2UI, &HB10BE924UI, &H2F6F7C87, &H58684C11, &HC1611DABUI, &HB6662D3DUI, &H76DC4190, &H1DB7106, &H98D220BCUI, &HEFD5102AUI, &H71B18589, &H6B6B51F, &H9FBFE4A5UI, &HE8B8D433UI, &H7807C9A2, &HF00F934, &H9609A88EUI, &HE10E9818UI, &H7F6A0DBB, &H86D3D2D, &H91646C97UI, &HE6635C01UI, &H6B6B51F4, &H1C6C6162, &H856530D8UI, &HF262004EUI, &H6C0695ED, &H1B01A57B, &H8208F4C1UI, &HF50FC457UI, &H65B0D9C6, &H12B7E950, &H8BBEB8EAUI, &HFCB9887CUI, &H62DD1DDF, &H15DA2D49, &H8CD37CF3UI, &HFBD44C65UI, &H4DB26158, &H3AB551CE, &HA3BC0074UI, &HD4BB30E2UI, &H4ADFA541, &H3DD895D7, &HA4D1C46DUI, &HD3D6F4FBUI, &H4369E96A, &H346ED9FC, &HAD678846UI, &HDA60B8D0UI, &H44042D73, &H33031DE5, &HAA0A4C5FUI, &HDD0D7CC9UI, &H5005713C, &H270241AA, &HBE0B1010UI, &HC90C2086UI, &H5768B525, &H206F85B3, &HB966D409UI, &HCE61E49FUI, &H5EDEF90E, &H29D9C998, &HB0D09822UI, &HC7D7A8B4UI, &H59B33D17, &H2EB40D81, &HB7BD5C3BUI, &HC0BA6CADUI, &HEDB88320UI, &H9ABFB3B6UI, &H3B6E20C, &H74B1D29A, &HEAD54739UI, &H9DD277AFUI, &H4DB2615, &H73DC1683, &HE3630B12UI, &H94643B84UI, &HD6D6A3E, &H7A6A5AA8, &HE40ECF0BUI, &H9309FF9DUI, &HA00AE27, &H7D079EB1, &HF00F9344UI, &H8708A3D2UI, &H1E01F268, &H6906C2FE, &HF762575DUI, &H806567CBUI, &H196C3671, &H6E6B06E7, &HFED41B76UI, &H89D32BE0UI, &H10DA7A5A, &H67DD4ACC, &HF9B9DF6FUI, &H8EBEEFF9UI, &H17B7BE43, &H60B08ED5, &HD6D6A3E8UI, &HA1D1937EUI, &H38D8C2C4, &H4FDFF252, &HD1BB67F1UI, &HA6BC5767UI, &H3FB506DD, &H48B2364B, &HD80D2BDAUI, &HAF0A1B4CUI, &H36034AF6, &H41047A60, &HDF60EFC3UI, &HA867DF55UI, &H316E8EEF, &H4669BE79, &HCB61B38CUI, &HBC66831AUI, &H256FD2A0, &H5268E236, &HCC0C7795UI, &HBB0B4703UI, &H220216B9, &H5505262F, &HC5BA3BBEUI, &HB2BD0B28UI, &H2BB45A92, &H5CB36A04, &HC2D7FFA7UI, &HB5D0CF31UI, &H2CD99E8B, &H5BDEAE1D, &H9B64C2B0UI, &HEC63F226UI, &H756AA39C, &H26D930A, &H9C0906A9UI, &HEB0E363FUI, &H72076785, &H5005713, &H95BF4A82UI, &HE2B87A14UI, &H7BB12BAE, &HCB61B38, &H92D28E9BUI, &HE5D5BE0DUI, &H7CDCEFB7, &HBDBDF21, &H86D3D2D4UI, &HF1D4E242UI, &H68DDB3F8, &H1FDA836E, &H81BE16CDUI, &HF6B9265BUI, &H6FB077E1, &H18B74777, &H88085AE6UI, &HFF0F6A70UI, &H66063BCA, &H11010B5C, &H8F659EFFUI, &HF862AE69UI, &H616BFFD3, &H166CCF45, &HA00AE278UI, &HD70DD2EEUI, &H4E048354, &H3903B3C2, &HA7672661UI, &HD06016F7UI, &H4969474D, &H3E6E77DB, &HAED16A4AUI, &HD9D65ADCUI, &H40DF0B66, &H37D83BF0, &HA9BCAE53UI, &HDEBB9EC5UI, &H47B2CF7F, &H30B5FFE9, &HBDBDF21CUI, &HCABAC28AUI, &H53B39330, &H24B4A3A6, &HBAD03605UI, &HCDD70693UI, &H54DE5729, &H23D967BF, &HB3667A2EUI, &HC4614AB8UI, &H5D681B02, &H2A6F2B94, &HB40BBE37UI, &HC30C8EA1UI, &H5A05DF1B, &H2D02EF8D}
  7.  
  8.     ' Определение суммы по пути к файлу
  9.     Public Shared Function CalcCRC32(filename As String) As Integer
  10.         Using stream As New IO.FileStream(filename, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read, m_chunkSize)
  11.             Return CalcCRC32(stream)
  12.         End Using
  13.     End Function
  14.  
  15.     ' Определение суммы по потоку
  16.     Public Shared Function CalcCRC32(stream As IO.Stream) As Integer
  17.         If stream Is Nothing Then
  18.             Throw New Exception("Checksum.CalcCRC32() - Неверный поток")
  19.         End If
  20.         If Not stream.CanRead Then
  21.             Throw New Exception("Checksum.CalcCRC32() - Не могу прочитать поток")
  22.         End If
  23.         Dim crc32 As UInteger = &HFFFFFFFFUI
  24.         stream.Position = 0
  25.         ' Стартуем
  26.         Dim bytesRead As Integer = 0
  27.         Dim streamData As Byte() = New Byte(m_chunkSize - 1) {}
  28.         Do
  29.             bytesRead = stream.Read(streamData, 0, m_chunkSize)
  30.             For i As Integer = 0 To bytesRead - 1
  31.                 crc32 = (m_crc_32_tab((crc32 Xor streamData(i)) And &HFF) Xor (crc32 >> 8))
  32.             Next
  33.         Loop While bytesRead > 0
  34.         stream.Position = 0
  35.         Return Not CInt(crc32)
  36.     End Function
  37. End Class

Чтобы вызвать функцию, используем этот код:

Код - vb.net [Выбрать]
  1.                     Dim filePath As String = "Путь к файлу на локальном компьютере"
  2.                     Dim CRC_sum As Integer = CheckSumm.CalcCRC32(filePath)

Спасибо статье: https://forums.autodesk.com/t5/vault-forum/code-snippets-vault-api/td-p/1714611

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 11
  • Skype: pashin.evgeniy
На всякий случай, тоже самое на C#:

Код - C# [Выбрать]
  1.     public class Checksum
  2.     {
  3.         // CRC check sum data
  4.         //
  5.         private const int m_chunkSize = 16384;
  6.         private static uint[] m_crc_32_tab =
  7.         {
  8.             0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
  9.             0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
  10.             0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
  11.             0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
  12.             0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
  13.             0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
  14.             0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
  15.             0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
  16.             0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
  17.             0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
  18.             0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
  19.             0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
  20.             0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
  21.             0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
  22.             0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
  23.             0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
  24.             0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
  25.             0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
  26.             0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
  27.             0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
  28.             0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
  29.             0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
  30.             0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
  31.             0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
  32.             0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
  33.             0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
  34.             0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
  35.             0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
  36.             0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
  37.             0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
  38.             0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
  39.             0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
  40.             0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
  41.             0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
  42.             0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
  43.             0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
  44.             0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
  45.             0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
  46.             0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
  47.             0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
  48.             0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
  49.             0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
  50.             0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
  51.             0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
  52.             0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
  53.             0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
  54.             0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
  55.             0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
  56.             0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
  57.             0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
  58.             0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
  59.             0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
  60.             0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
  61.             0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
  62.             0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
  63.             0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
  64.             0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
  65.             0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
  66.             0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
  67.             0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
  68.             0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
  69.             0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
  70.             0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
  71.             0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
  72.         };
  73.  
  74.         public static int CalcCRC32(string filename)
  75.         {
  76.             using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, m_chunkSize))
  77.             return CalcCRC32(stream);
  78.         }
  79.         public static int CalcCRC32(Stream stream)
  80.         {
  81.             if ( stream == null )
  82.                 throw new Exception("Checksum.CalcCRC32() - Invalid stream");
  83.             if ( !stream.CanRead )
  84.                 throw new Exception("Checksum.CalcCRC32() - Cannot read stream");
  85.             uint crc32 = 0xFFFFFFFF;
  86.             stream.Position = 0; // beginning
  87.             int bytesRead = 0;
  88.             byte[] streamData = new byte[m_chunkSize];
  89.             do
  90.             {
  91.                 bytesRead = stream.Read(streamData, 0, m_chunkSize);
  92.                 for (int i = 0; i < bytesRead; i++)
  93.                 {
  94.                     crc32 = (m_crc_32_tab[(crc32 ^ streamData[i]) & 0xff] ^ (crc32 >> 8));
  95.                 }
  96.             } while (bytesRead > 0);
  97.             stream.Position = 0; // reset
  98.             crc32 = ~crc32;
  99.             return (int)(crc32);
  100.         }
  101.     }
  102.