Страница 28 из 52
Добавлено: Вт мар 10, 2015 14:38
SVM
Flasher
Переименовывает умляуты и кирилицу, но на больших файлах (проверял на 2-3 гигабайтных), начинает занимать всю оперативную память 2 Гб и выскакивает ошибка:
Строка: 46
Символ: 31
Ошибка: Недостаточно памяти для завершения операции.
Код: 8007000E
Источник: Provider
Первый скрипт с XMD5.dll на этих же файлах занимает 3,5 Мб
Flasher писал(а):Кстати, а почему не сделать аналог с фильтром и созданием Info.<CRC>?
Хорошо бы, как в rhash обновление crc файлов, a если их нет то создание.
Добавлено: Вт мар 10, 2015 19:36
Flasher
SVM
Насчёт памяти не знаю как решить в контексте приложенного модуля. Читается с экономией, а вот запись кусками приходит в объект до заполнения. У XMD5 свой внутренний алгоритм работы с заданным файлом, там этот вопрос, что логично, решён.
По поводу обновления и создания. А разве в скрипте создания Info.txt не так?
Добавлено: Вт мар 10, 2015 22:04
SVM
Flasher писал(а):А разве в скрипте создания Info.txt не так?
Ну там всё быстро происходит. Я имел ввиду rhash может не пересчитывать заново crc всех файлов (судя по скорости), а считает только те файлы которых нет в *.md5 и дополняет crc файл.
Добавлено: Вт мар 10, 2015 22:28
Flasher
SVM
Быстро или нет отношения к делу не имеет.
SVM писал(а):rhash может не пересчитывать заново crc всех файлов (судя по скорости), а считает только те файлы которых нет в *.md5 и дополняет crc файл.
Так не бывает. Чтобы что-то дополнить, нужно узнать, что дополнять, а значит, перечитать crc. Только это делать вовсе необязательно, достаточно перезаписать файл целиком. Поэтому я и не понял, зачем приводился пример с rhash, если данное событие в аналоге и так реализовано.
SVM писал(а):всю оперативную память 2 Гб
А чего не подкупить ещё? За 2-2.5 тыс. можно взять 4 Гб.
Добавлено: Вт мар 10, 2015 23:54
SVM
Flasher писал(а):Так не бывает.
Я думал в rhash -u, --update, в файле crc проверяет по имени недостающие файлы, считает только их и добавляет в crc файл. Например в папке 1 Тб файлов, добавил несколько файлов в папку и из-за этого пересчитывать все файлы? Я делаю это вручную, посчитал crc 2 файлов, открыл в akelPad, скопировал 2 строки в буфер, добавил в общий crc.
Flasher писал(а):А чего не подкупить ещё?
Компьютеру лет 6, его проще полностью обновить или искать БУ память.
Добавлено: Ср мар 11, 2015 01:04
Flasher
Согласен, хэш - не размер, нужен чисто update.
SVM писал(а):Компьютеру лет 6, его проще полностью обновить или искать БУ память

Так 6 лет назад современные материнки допускали на борт DDR3.
Ещё посмотрю пару-тройку компонентов, работающих отдельно с файлами, как они с юникодными именами справляются. Если повезёт, сообщу.
Добавлено: Чт мар 12, 2015 00:47
Flasher
SVM
Новости неутешительные. Никто не хочет читать юникодные имена (умляутов не касается). Так как быть? Временно переименовывать на момент чекинга? Или к rhash обратимся?
[cut="Про rhash:"]Жаль, что он не может сохранять в UTF-8 с ВОМ, а то Тотал кириллицу без ВОМ не прочтёт. А ТС-шную форму подобрать - раз плюнуть: rhash.exe -i -M -p"%m *%f\n" --speed --percents -o"Info.md5" *.*
Рекурсия там есть, но она собирает всё в один файл, что для нас, как я понимаю, не годится.[/cut]
Добавлено: Чт мар 12, 2015 11:49
SVM
Flasher писал(а):Так как быть? Временно переименовывать на момент чекинга? Или к rhash обратимся?
Тогда буду пользоваться первым скриптом XMD5, а умляуты и юникод переименовывать в Total Commander.
Flasher писал(а):Рекурсия там есть, но она собирает всё в один файл, что для нас, как я понимаю, не годится
Нужен скрипт аналог предыдущих скриптов, то есть в каждой папке *.md5 файл
Добавлено: Чт мар 12, 2015 13:19
Flasher
SVM писал(а):Тогда буду пользоваться первым скриптом XMD5
Мм.. А что не так с утилитами? Я помимо rhash ещё 3 нашёл, которые читают юникодные имена. Самая маленькая - 93 Кб.
SVM писал(а):а умляуты и юникод переименовывать в Total Commander.
Я то имел в виду - скриптом переименовывать...
SVM писал(а):Нужен скрипт аналог предыдущих скриптов, то есть в каждой папке *.md5 файл
Да, я понимаю, просто вариант с единым для подпапок хэш-файлом не такой уж и безнадёжный в плане удобства. Только работать с ним придётся не средствами ТС.
Добавлено: Чт мар 12, 2015 14:43
SVM
Flasher писал(а):А что не так с утилитами? Я помимо rhash ещё 3 нашёл, которые читают юникодные имена.
Не пойму это про какой скрипт, переименование файлов в структуре активного каталога по MD5, или подсчёт crc - сумм файлов и добавления в crc файлы? Если есть решение по умляутам и юникоду, то было бы отлично.
Flasher писал(а):просто вариант с единым для подпапок хэш-файлом не такой уж и безнадёжный в плане удобства.
Может этот вариант и удобный, но отпадает возможность проверки в Total Commander. А если удалить папку, потом нужно будет обновлять единый crc файл. Проще удалить папку вместе с crc файлом и не обновлять единый crc файл.
Добавлено: Чт мар 12, 2015 19:06
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 или другой утилитой. Это видится оптимальней по скорости. И, соответственно, это уже будет в ином топике.
Добавлено: Пт мар 13, 2015 21:06
SVM
Flasher
Работает, но зачем то после переименования подсчитывает crc переименованных файлов.
Добавлено: Пт мар 13, 2015 22:44
Flasher
SVM
С чего такой вывод?
Добавлено: Пт мар 13, 2015 23:18
SVM
Flasher
Переименовывает например 10 минут, потом 10 минут ничего не переименовывает, в процессах идёт подсчёт md5 уже переименованного файла "C:\Program Files\Total Commander\Plugins\utils\HashFile\hashfile.exe" -md5 "L:\Папка\Переименованный_файл.mp4"
Добавлено: Пт мар 13, 2015 23:43
Flasher
SVM писал(а):потом 10 минут ничего не переименовывает
Скрипт проверяет все файлы, в том числе те, что не были переименованы. Это же заведомо узнать невозможно.
А само окно появляется за 10 минут до окончания? Что-то не верится.
И зачем тут ключ -md5? См. внимательно описание в шапке.
SVM писал(а):в процессах идёт подсчёт md5 уже переименованного файла
В коде нет ничего такого, чтобы подобное могло происходить.
Добавил счётчики. Если все требуемые файлы будут переименованы, то скрипт должен завершить работу.