Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Расчет контрольной суммы CRC
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Andruxa



Joined: 21 Jun 2009
Posts: 3

Post (Separately) Posted: Sun Jun 21, 2009 18:47    Post subject: Расчет контрольной суммы CRC Reply with quote

Здравствуйте.
При работе с Total Commander возникла следующая необходимость.
При расчете контрольной суммы, чтобы имя архива и сама контрольная сумма автоматом копировалась в Excel (Например в ячейку A1).
С помощью чего это можно реализовать?

 !  Моторокер:
Перенесено в Автоматизацию - просто средствами Тотала это не сделать.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Tue Jun 23, 2009 10:52    Post subject: Reply with quote

vbs-скрипт:
Code:
'====================================================================================
' Подсчет CRC32 у файлов из файла-списка. Сохранение CRC32 в excel-файле.

' Параметры скрипта:
'   {файл-список} {excel-файл}

' Для работы скрипта необходимо зарегистрировать в системе компонент DynamicWrapperX
'====================================================================================
Option Explicit
'=============== Изменяемые параметры ===============================================
Const StartCell = "A1" 'Первая ячейка таблицы
'====================================================================================

Dim WRP, FSO, WSH, Mess, FileList, XlsFile, FCrc, F, K, objXL, i, j
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
Set WRP = CreateObject("DynamicWrapperX")
WRP.Register "ImageHlp.DLL", "MapFileAndCheckSum", "i=sUU", "r=u"

MessDefine
CheckParams

Set FCrc = CreateObject("Scripting.Dictionary")
For Each F In Split(FSO.OpenTextFile(FileList).ReadAll, vbNewLine)
  If F <> "" Then
    F = GetPath(F)
    If Not FCrc.Exists(F) Then FCrc.Add F, GetCrc(F)
  End If
Next

Set objXL = WScript.CreateObject("Excel.Application")
objXL.Workbooks.Open XlsFile
i = objXL.Range(StartCell).Row
j = objXL.Range(StartCell).Column

For Each K In FCrc.Keys
  objXL.Cells(i,j  ).Value = K
  objXL.Cells(i,j+1).Value = FCrc(K)
  i = i + 1
Next

'Сохранение результатов
objXL.Application.ActiveWorkbook.Save
objXL.Quit()

MsgBox Mess(5), vbInformation + vbOKOnly, Mess(0)
Quit

'===== Процедуры и функции ===============================================================
'Проверка входных параметров
Sub CheckParams
  With WScript
    If .Arguments.Count = 0 Then
      MsgBox Mess(1), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    FileList = GetPath(.Arguments(0))
    If Not FSO.FileExists(FileList) Then
      MsgBox Mess(2), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    If .Arguments.Count < 2 Then
      MsgBox Mess(3), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    XlsFile = GetPath(.Arguments(1))
    If Not FSO.FileExists(XlsFile) Then
      MsgBox Mess(4), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
  End With
End Sub

'Подсчет контрольной суммы файла
Function GetCrc(pPath)
  Dim lRess, lsHeader, lsCalcd
  lsHeader = 0: lsCalcd = 0
  lRess = WRP.MapFileAndCheckSum(pPath, lsHeader, lsCalcd)
  GetCrc = lsCalcd
End Function

'Путь
Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

'Описание сообщений
Sub MessDefine
  Set Mess = CreateObject("Scripting.Dictionary")
  With Mess
    .Add 0,  "Подсчет CRC32"
    .Add 1,  "Не указаны параметры!"
    .Add 2,  "Файл-список не существует!"
    .Add 3,  "Указаны не все параметры!"
    .Add 4,  "Excel-файл не существует!"
    .Add 5,  "Операция завершена."
  End With
End Sub

'Выход
Sub Quit
  Set objXL = Nothing
  Set Mess  = Nothing
  Set FCrc  = Nothing
  Set WRP   = Nothing
  Set WSH   = Nothing
  Set FSO   = Nothing
  WScript.Quit
End Sub

Для работы скрипта необходим DynamicWrapperX.

Для работы скрипта по выделенным файлам в TC первым параметром нужно указать %L, вторым - имя существующего Excel-файла, в который сбрасываются результаты.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Wed Jun 24, 2009 00:40    Post subject: Reply with quote

Batya, а с чего ты вообще решил, что MapFileAndCheckSum выдает результатом CRC32? Насколько мне это известно - это вообще какая-то левая (т.е. недокументированная) контрольная сумма.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Jun 24, 2009 09:22    Post subject: Reply with quote

Volniy
Навеяло.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Andruxa



Joined: 21 Jun 2009
Posts: 3

Post (Separately) Posted: Thu Jun 25, 2009 23:41    Post subject: Reply with quote

Batya wrote:
vbs-скрипт:
Code:
'====================================================================================
' Подсчет CRC32 у файлов из файла-списка. Сохранение CRC32 в excel-файле.

' Параметры скрипта:
'   {файл-список} {excel-файл}

' Для работы скрипта необходимо зарегистрировать в системе компонент DynamicWrapperX
'====================================================================================
Option Explicit
'=============== Изменяемые параметры ===============================================
Const StartCell = "A1" 'Первая ячейка таблицы
'====================================================================================

Dim WRP, FSO, WSH, Mess, FileList, XlsFile, FCrc, F, K, objXL, i, j
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
Set WRP = CreateObject("DynamicWrapperX")
WRP.Register "ImageHlp.DLL", "MapFileAndCheckSum", "i=sUU", "r=u"

MessDefine
CheckParams

Set FCrc = CreateObject("Scripting.Dictionary")
For Each F In Split(FSO.OpenTextFile(FileList).ReadAll, vbNewLine)
  If F <> "" Then
    F = GetPath(F)
    If Not FCrc.Exists(F) Then FCrc.Add F, GetCrc(F)
  End If
Next

Set objXL = WScript.CreateObject("Excel.Application")
objXL.Workbooks.Open XlsFile
i = objXL.Range(StartCell).Row
j = objXL.Range(StartCell).Column

For Each K In FCrc.Keys
  objXL.Cells(i,j  ).Value = K
  objXL.Cells(i,j+1).Value = FCrc(K)
  i = i + 1
Next

'Сохранение результатов
objXL.Application.ActiveWorkbook.Save
objXL.Quit()

MsgBox Mess(5), vbInformation + vbOKOnly, Mess(0)
Quit

'===== Процедуры и функции ===============================================================
'Проверка входных параметров
Sub CheckParams
  With WScript
    If .Arguments.Count = 0 Then
      MsgBox Mess(1), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    FileList = GetPath(.Arguments(0))
    If Not FSO.FileExists(FileList) Then
      MsgBox Mess(2), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    If .Arguments.Count < 2 Then
      MsgBox Mess(3), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    XlsFile = GetPath(.Arguments(1))
    If Not FSO.FileExists(XlsFile) Then
      MsgBox Mess(4), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
  End With
End Sub

'Подсчет контрольной суммы файла
Function GetCrc(pPath)
  Dim lRess, lsHeader, lsCalcd
  lsHeader = 0: lsCalcd = 0
  lRess = WRP.MapFileAndCheckSum(pPath, lsHeader, lsCalcd)
  GetCrc = lsCalcd
End Function

'Путь
Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

'Описание сообщений
Sub MessDefine
  Set Mess = CreateObject("Scripting.Dictionary")
  With Mess
    .Add 0,  "Подсчет CRC32"
    .Add 1,  "Не указаны параметры!"
    .Add 2,  "Файл-список не существует!"
    .Add 3,  "Указаны не все параметры!"
    .Add 4,  "Excel-файл не существует!"
    .Add 5,  "Операция завершена."
  End With
End Sub

'Выход
Sub Quit
  Set objXL = Nothing
  Set Mess  = Nothing
  Set FCrc  = Nothing
  Set WRP   = Nothing
  Set WSH   = Nothing
  Set FSO   = Nothing
  WScript.Quit
End Sub

Для работы скрипта необходим DynamicWrapperX.

Для работы скрипта по выделенным файлам в TC первым параметром нужно указать %L, вторым - имя существующего Excel-файла, в который сбрасываются результаты.

Можно поподробнее про установку.
Это макрос?
Что куда вставлять? спасибо
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Fri Jun 26, 2009 11:16    Post subject: Reply with quote

Andruxa
Сразу хочу попросить - не нужно лишнего цитирования. Повторение скрипта в цитате выглядит слишком неуместно.

Инструкция:
1. Скачай по ссылке DynamicWrapperX.
2. Установи этот компонент, как написано в инструкции к нему.
3. Сохрани код скрипта в текстовый файл с расширением vbs.
4. Перетащи получившийся файл на панель TC - получится кнопка.
5. На кнопке нажми правую кнопку мыши -> Изменить. В строке "Параметры" напиши
Code:
%L "{полный путь к Excel-файлу}"
где вместо {полный путь к Excel-файлу} укажи свой путь к тому Excel-файлу, в котором нужно сохранить результаты. (Внимание! В момент выполнения скрипта Excel-файл НЕ должен быть открыт.) -> ОК
6. Выдели архивы, контрольные суммы которых нужно посчитать.
7. Нажми кнопку.
8. После сообщения о выполнении операции открой Excel-файл. В первом столбце будет полный путь к файлу, во втором - контрольная сумма.

Однако, по сообщению Volniy мой скрипт, может быть, считает совсем не CRC32, а какую-то недокументированную контрольную сумму.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Andruxa



Joined: 21 Jun 2009
Posts: 3

Post (Separately) Posted: Sat Jun 27, 2009 02:04    Post subject: Reply with quote

Batya wrote:
Andruxa
Сразу хочу попросить - не нужно лишнего цитирования. Повторение скрипта в цитате выглядит слишком неуместно.

Инструкция:
1. Скачай по ссылке DynamicWrapperX.
2. Установи этот компонент, как написано в инструкции к нему.
3. Сохрани код скрипта в текстовый файл с расширением vbs.
4. Перетащи получившийся файл на панель TC - получится кнопка.
5. На кнопке нажми правую кнопку мыши -> Изменить. В строке "Параметры" напиши
Code:
%L "{полный путь к Excel-файлу}"
где вместо {полный путь к Excel-файлу} укажи свой путь к тому Excel-файлу, в котором нужно сохранить результаты. (Внимание! В момент выполнения скрипта Excel-файл НЕ должен быть открыт.) -> ОК
6. Выдели архивы, контрольные суммы которых нужно посчитать.
7. Нажми кнопку.
8. После сообщения о выполнении операции открой Excel-файл. В первом столбце будет полный путь к файлу, во втором - контрольная сумма.

Однако, по сообщению Volniy мой скрипт, может быть, считает совсем не CRC32, а какую-то недокументированную контрольную сумму.

Спасибо с установкой разобрался.
Я так понимаю он считает в десятичной системе. А можно в шестнадцатеричную? в ТС Есть ведь расчет контрольной суммы нельзя его програмно поправить, чтобы он сохранял в Excel ?
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Sat Jun 27, 2009 09:14    Post subject: Reply with quote

Andruxa
Способ 1
настрой свой набор колонок с использованием crc32tag.wdx и разделителями ',' или ';';
сохрани содержимое колонок в текстовый файл с расширением .CSV;
открой .CSV в Excel
Способ 2
подправь готовую схему "Directory -> CSV" в плагине WdxInfoPacker.wcx, чтобы она сохраняла и значение CRC.
Например:
Code:
[Directory -> CSV (+CRC32)]
use="abcdeh"
Extension=".csv"
Divider=","
header="File,Size,Date,CRC32"
before="%N"
name="@Mod=size.kbytes@filesys.wdx; kB"
between="@Mod=writedate@filesys.wdx; ;@Mod=writetime.h:m@filesys.wdx;"
wdxinfo="@Mod=GetCrc32FromFile.NoBrackets@crc32tag.wdx;"
DoNotWriteEmpty=1
SaveErrorLog=1
MaxRight=12
Back to top
View user's profile Send private message
X-myRzA



Joined: 15 Oct 2010
Posts: 3

Post (Separately) Posted: Fri Oct 15, 2010 16:19    Post subject: Reply with quote

Добрый день.
Как можно реализовать такую функцию.
Есть каталог файлами и папками, файлы упакованы через lzma архиватор. Теперь над вытащить информацию: filename="файл" checksum="crc32_сумма_упак_файл", original="crc32_сумма_ориг_файл", size="размер_ориг_файла" и информацию выгрузить в xml файл.
по этому порядку:
Code:
<list>
<archive filename="file.exe" checksum="46FAA0C9" original="68C6D920" size="45056"/>
***
</list>

Можно сделать? Smile [/quote]


Last edited by X-myRzA on Sat Oct 16, 2010 09:59; edited 1 time in total
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Fri Oct 15, 2010 16:40    Post subject: Reply with quote

X-myRzA
Тот механизм, который используется в приведённом здесь скрипте, предполагает наличие файла, для которого считается CRC32-сумма. Других возможностей я не знаю. Т.е. для описанной задачи придётся всё распаковывать (создавать временные файлы).
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
X-myRzA



Joined: 15 Oct 2010
Posts: 3

Post (Separately) Posted: Fri Oct 15, 2010 16:46    Post subject: Reply with quote

Можно создать временные файлы или можно взять сразу два каталога, один упакованный другой оригинал. Только надо информацию выгрузить в xml файл.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Mon Oct 18, 2010 09:24    Post subject: Reply with quote

X-myRzA wrote:
... или можно взять сразу два каталога, один упакованный другой оригинал.

Ну так, если есть незапакованый оригинал, то всё просто.

Добавлено:
А как соотнести имя файла и имя архива?
Т.е., предположим, что есть файл-список архивов. Варианты:
1. Оригинальные файлы искать в определённой папке? Тогда какие имена у оригинальных файлов?
2. Или существует соответствующий (соответствие по строкам) файл-список оригинальных файлов?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Mon Oct 18, 2010 17:43    Post subject: Reply with quote

X-myRzA
На форуме бывает человек, знакомый с LZMA-сжатием . Попробуй попросить его написать WDX-плагин или консольную утилиту для получения контрольных сумм.
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Fri Dec 31, 2010 19:35    Post subject: Reply with quote

Оказывается, консольные версии 7z умеют показывать CRC файлов
Quote:
-slt (Show technical information) switch
Sets technical mode for l (List) command.

Example
7z l -slt archive.7z
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Tue May 19, 2015 01:42    Post subject: Reply with quote

Вспомнилось. В обсуждении с SVM тут и тут была мысль написать аналог рекурсивного создания файлов с размерами только уже с CRC. Вот что вышло:
Code:
'===================================================================================
' Создание/перезапись хэш-файла в активном каталоге или в каждой ветви его структуры
' Ссылка на утилиту RHash: http://sourceforge.net/projects/rhash/files/rhash/

' Условия: путь запуска - пустой;
'          положить в каталог программы 64-битную версию с именем rhash64.exe

' Параметры: <хэш-формат> <маска расширения> <не/включать рекурсию: 0/1>
' Хэш-формат: crc32, md4, md5, sha1, sha-224, sha-256, sha-384, sha-512, sha3-224,
' sha3-256, sha3-384, sha3-512, tiger, tth, has160, aich, ed2k, gost-cryptopro,
' gost, btih, ripemd160, whirlpool, snefru128, snefru256, edon-r256, edon-r512

' Примеры:  md5 *.* 0  |  sha1 *.avi 1

' Автор: Flasher ©
'===================================================================================
Option Explicit
Dim RHash, Alg, Filt, Test, ShA, Ext, Ps, Flt, FN, Title, Path, F, Items, Sum, Fold
'========================== Путь к утилите RHash (32 bit) ==========================
RHash = """%COMMANDER_PATH%\Utils\RHash\rhash.exe"""
'===================================================================================
With WScript.Arguments Alg = .Item(0) : Filt = .Item(1) : Test = .Item(2) End With
Dim C(2), WSH : Set WSH = CreateObject("WScript.Shell")
Ext = Alg : Set ShA = CreateObject("Shell.Application")
Select Case Alg : Case "crc32" Ext = "sfv" : Case "sha1" Ext = "sha" End Select
If InStr(Alg, "sha-") Then Ext = "sha" & Mid(Alg, 5)
If Filt <> "*.*" Then Ps = UCase(Mid(Filt,3)) : Flt = "_for_" & Ps Else Ps = "(объекты)"
If WSH.Environment("System")("PROCESSOR_ARCHITECTURE") = "AMD64" Then _
RHash = Left(RHash, InStrRev(RHash, ".") - 1) & "64.exe"""
ForFolder WSH.CurrentDirectory, FN : Title = " Создание CRC-файлов " & Ucase(Ext)
If C(0) = "" Then
  MsgBox "Файлы " & Ps & " отсутствуют!", 48, Title
ElseIf C(0) = 1 And C(1) = "" Then WSH.Run """%COMMANDER_EXE%"" /O /S /L=""" & FN & """"
Else MsgBox Ucase(Ext) & "-файлов:" & String(2, vbTab) & C(0) & vbCr &_
"Контрольных сумм:" & vbTab & C(2), 64, Title & " (результат) :" End If

Sub ForFolder(Path, F)
  Set Items = ShA.NameSpace(Path).Items
  Items.Filter  64, "*." & Ext
  If Items.Count = 1 And Filt = "*.*" Then _
  F = Items.Item(0).Path Else F = Path & "\Checksum" & Flt & "." & Ext
  Items.Filter 192, Filt : Sum = Items.Count
  If Sum Then
    Items.Filter 64, Right(F, Len(F) - InStrRev(F,"\")): If Items.Count Then Sum = Sum - 1
    WSH.Run RHash &_
    " -i -p""%{" & Alg & "} *%f\n"" -o""" & F & """ """ & Path &"\" & Filt & """", 0, True
    With CreateObject("ADODB.Stream")
      .Open : .CharSet = "UTF-8" : .LoadFromFile F : .Type = 1 : .SaveToFile F, 2 : .Close
    End With : C(0) = C(0) + 1 : C(2) = C(2) + Sum
  End If
  If Test Then
    Items.Filter 160, "*"
    If Items.Count Then C(1) = 1 : For Each Fold in Items : ForFolder Fold.Path, F : Next
  End If
End Sub
Для TC, как известно, актуальны: crc32, md5, sha1, sha-256, sha-512. Поддерживаются имена с Юникодом.
+ Автопереход к корневому CRC-файлу при отключённой рекурсии.
К сожалению, обновление по --update отпало, RHash косячит, дописывая суммы во все соседние текстовые файлы.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group