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

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

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

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

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

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

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

  • ADN PRO
  • *
  • Сообщений: 620
  • Карма: 8
  • 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