Групповое переименование

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Flasher
Переименовывает умляуты и кирилицу, но на больших файлах (проверял на 2-3 гигабайтных), начинает занимать всю оперативную память 2 Гб и выскакивает ошибка:

Строка: 46
Символ: 31
Ошибка: Недостаточно памяти для завершения операции.
Код: 8007000E
Источник: Provider

Первый скрипт с XMD5.dll на этих же файлах занимает 3,5 Мб
Flasher писал(а):Кстати, а почему не сделать аналог с фильтром и созданием Info.<CRC>?
Хорошо бы, как в rhash обновление crc файлов, a если их нет то создание.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

SVM
Насчёт памяти не знаю как решить в контексте приложенного модуля. Читается с экономией, а вот запись кусками приходит в объект до заполнения. У XMD5 свой внутренний алгоритм работы с заданным файлом, там этот вопрос, что логично, решён.

По поводу обновления и создания. А разве в скрипте создания Info.txt не так?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Flasher писал(а):А разве в скрипте создания Info.txt не так?
Ну там всё быстро происходит. Я имел ввиду rhash может не пересчитывать заново crc всех файлов (судя по скорости), а считает только те файлы которых нет в *.md5 и дополняет crc файл.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

SVM
Быстро или нет отношения к делу не имеет.
SVM писал(а):rhash может не пересчитывать заново crc всех файлов (судя по скорости), а считает только те файлы которых нет в *.md5 и дополняет crc файл.
Так не бывает. Чтобы что-то дополнить, нужно узнать, что дополнять, а значит, перечитать crc. Только это делать вовсе необязательно, достаточно перезаписать файл целиком. Поэтому я и не понял, зачем приводился пример с rhash, если данное событие в аналоге и так реализовано.
SVM писал(а):всю оперативную память 2 Гб
А чего не подкупить ещё? За 2-2.5 тыс. можно взять 4 Гб.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Flasher писал(а):Так не бывает.
Я думал в rhash -u, --update, в файле crc проверяет по имени недостающие файлы, считает только их и добавляет в crc файл. Например в папке 1 Тб файлов, добавил несколько файлов в папку и из-за этого пересчитывать все файлы? Я делаю это вручную, посчитал crc 2 файлов, открыл в akelPad, скопировал 2 строки в буфер, добавил в общий crc.
Flasher писал(а):А чего не подкупить ещё?
Компьютеру лет 6, его проще полностью обновить или искать БУ память.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Согласен, хэш - не размер, нужен чисто update.
SVM писал(а):Компьютеру лет 6, его проще полностью обновить или искать БУ память
Изображение Так 6 лет назад современные материнки допускали на борт DDR3.

Ещё посмотрю пару-тройку компонентов, работающих отдельно с файлами, как они с юникодными именами справляются. Если повезёт, сообщу.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

SVM
Новости неутешительные. Никто не хочет читать юникодные имена (умляутов не касается). Так как быть? Временно переименовывать на момент чекинга? Или к rhash обратимся?

[cut="Про rhash:"]Жаль, что он не может сохранять в UTF-8 с ВОМ, а то Тотал кириллицу без ВОМ не прочтёт. А ТС-шную форму подобрать - раз плюнуть: rhash.exe -i -M -p"%m *%f\n" --speed --percents -o"Info.md5" *.*
Рекурсия там есть, но она собирает всё в один файл, что для нас, как я понимаю, не годится.[/cut]
Последний раз редактировалось Flasher Вс мар 15, 2015 08:44, всего редактировалось 1 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Flasher писал(а):Так как быть? Временно переименовывать на момент чекинга? Или к rhash обратимся?
Тогда буду пользоваться первым скриптом XMD5, а умляуты и юникод переименовывать в Total Commander.
Flasher писал(а):Рекурсия там есть, но она собирает всё в один файл, что для нас, как я понимаю, не годится
Нужен скрипт аналог предыдущих скриптов, то есть в каждой папке *.md5 файл
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

SVM писал(а):Тогда буду пользоваться первым скриптом XMD5
Мм.. А что не так с утилитами? Я помимо rhash ещё 3 нашёл, которые читают юникодные имена. Самая маленькая - 93 Кб.
SVM писал(а):а умляуты и юникод переименовывать в Total Commander.
Я то имел в виду - скриптом переименовывать...
SVM писал(а):Нужен скрипт аналог предыдущих скриптов, то есть в каждой папке *.md5 файл
Да, я понимаю, просто вариант с единым для подпапок хэш-файлом не такой уж и безнадёжный в плане удобства. Только работать с ним придётся не средствами ТС.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Flasher писал(а):А что не так с утилитами? Я помимо rhash ещё 3 нашёл, которые читают юникодные имена.
Не пойму это про какой скрипт, переименование файлов в структуре активного каталога по MD5, или подсчёт crc - сумм файлов и добавления в crc файлы? Если есть решение по умляутам и юникоду, то было бы отлично.
Flasher писал(а):просто вариант с единым для подпапок хэш-файлом не такой уж и безнадёжный в плане удобства.
Может этот вариант и удобный, но отпадает возможность проверки в Total Commander. А если удалить папку, потом нужно будет обновлять единый crc файл. Проще удалить папку вместе с crc файлом и не обновлять единый crc файл.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

SVM писал(а):Не пойму это про какой скрипт, переименование файлов в структуре активного каталога по MD5 ... Если есть решение по умляутам и юникоду, то было бы отлично.
Сперва нужно сделанное допилить, т.е. речь только о Юникоде и сохранении памяти.
Не буду тогда править старый вариант.
[cut="Вот новый:"]

Код: Выделить всё

'======================================================================
' Восстановить имена файлов в структуре активного каталога, сопоставляя
' данные с вложенным в каждую директорию хэш-файлом (по умолчанию md5)
' Ссылка на утилиту: http://www.fastpictureviewer.com/bin/hashfile.zip

' Условие:   путь запуска - пустой
' Параметры: <фильтр-список расширений> <-sha1|-sha256>
' Примеры:   *.*  |  *.txt;*.lst -sha1

' Автор: Flasher ©
'======================= Путь к утилите hashfile ======================
HPath = """%COMMANDER_PATH%\Utils\hashfile\hashfile.exe"""
'======================================================================
With WScript.Arguments
   Filt = .Item(0) : If .Count = 2 Then Alg = " " & .Item(1)
End With : Dim WSH : Set WSH = CreateObject("WScript.Shell")
If InStrRev(WScript.FullName, "WScript.exe") Then
  WSH.Run "CScript.exe """ & WScript.ScriptFullName & """ " & Filt & Alg, 0
  WScript.Quit
End If : Set ShA  = CreateObject("Shell.Application")
Set FSO  = CreateObject("Scripting.FileSystemObject")
Set Dict = CreateObject("Scripting.Dictionary")
Ext = Mid(Alg, 3) : If Ext = "sha1" Then Ext = "sha"
T = 1 : If Alg = "" Then Ext = "md5"
ForFolder WSH.CurrentDirectory
WSH.Popup Space(10) & "Готово!", 1.5, "  Восстановление имён по " & Alg, 64

Sub ForFolder(Path)
  Set Items = ShA.NameSpace(Path).Items
  Items.Filter 192, "*." & Ext
  If Items.Count = 1 Then
    FP = Items.Item(0).Path
    With CreateObject("ADODB.Stream")
      .Open : .LoadFromFile FP : .Type = 1
      For i = 2 To 4
        .Position = 0 : .Read(i) : Str = Str & Hex(AscB(.Read(2)))
      Next : Enc = "windows-1251" : If Str = "EFBBBF" Then Enc = "UTF-8"
      .Close : .Type = 2 : .Open : .CharSet = Enc : .LoadFromFile FP
      Do : F = .ReadText(-2) : Str = Split(F, " *")
        Sum = Str(0) : If Filt <> "*.*" Then T = 0
        If T = 0 And InStr(LCase(Filt), LCase(FSO.GetExtensionName(Str(1)))) Then T = 1
        If T And Not Dict.Exists(Sum) Then Dict.Add Sum, Str(1) : c = c + 1
      Loop Until .EOS : .Close
    End With : Items.Filter 192, Filt
    For Each F in Items
      If LCase(FSO.GetExtensionName(F)) <> Ext And Abs(F.Size) > 0 Then
        Sum = Split(WSH.Exec(HPath & Alg & " """ & F.Path & """").StdOut.ReadLine, ": ")(1)
        Sum = Left(Sum, Len(Sum) - 1)
        If Dict.Exists(Sum) Then
          s = s + 1 : N = Dict.Item(Sum) : If Not FSO.FileExists(Path & "" & N) Then F.Name = N
        End If
      End If : If s = c Then Exit For
    Next : Dict.RemoveAll
  End If : Items.Filter 160, "*"
  If Items.Count Then
    For Each Fold in Items : ForFolder Fold.Path : Next
  End If
End Sub
[/cut]
Что касается объединения, то я пока не решил. Думаю, что лучше будет добавлять ВОМ к создаваемым UTF-8-спискам самим rhash или другой утилитой. Это видится оптимальней по скорости. И, соответственно, это уже будет в ином топике.
Последний раз редактировалось Flasher Сб мар 14, 2015 01:38, всего редактировалось 2 раза.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Flasher
Работает, но зачем то после переименования подсчитывает crc переименованных файлов.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

SVM
С чего такой вывод?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Flasher
Переименовывает например 10 минут, потом 10 минут ничего не переименовывает, в процессах идёт подсчёт md5 уже переименованного файла "C:\Program Files\Total Commander\Plugins\utils\HashFile\hashfile.exe" -md5 "L:\Папка\Переименованный_файл.mp4"
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

SVM писал(а):потом 10 минут ничего не переименовывает
Скрипт проверяет все файлы, в том числе те, что не были переименованы. Это же заведомо узнать невозможно.
А само окно появляется за 10 минут до окончания? Что-то не верится.
И зачем тут ключ -md5? См. внимательно описание в шапке.
SVM писал(а):в процессах идёт подсчёт md5 уже переименованного файла
В коде нет ничего такого, чтобы подобное могло происходить.

Добавил счётчики. Если все требуемые файлы будут переименованы, то скрипт должен завершить работу.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить