Переписал на VBScript:
Option Explicit
Dim Title, objArgs, objWSHShell
Title = "Сравнение MP3 файлов v.0.2a"
Set objArgs = WScript.Arguments
Set objWSHShell = WScript.CreateObject("WScript.Shell")
If objArgs.length=0 Then
objWSHShell.Popup "Сравнение MP3 файлов." &vbCr& "При сравнении учитывается только сам MPEG поток." &vbCr& "Тэги ID3v1 и ID3v2 игнорируются." &vbCr&vbCr& "Использование:" &vbCr& WScript.ScriptName & " файл1 файл2", 0, Title, 64
WScript.Quit
End If
Dim objFSO, File(1), size(1), f(1), i
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
With WScript.CreateObject("ADODB.Stream")
.Type = 1
For i=0 To 1
File(i) = objFSO.GetAbsolutePathName(objArgs(i))
.Open
.LoadFromFile(File(i))
size(i) = .Size
f(i) = .Read
.Close
Next
End With
Set objArgs = Nothing
Set objFSO = Nothing
Dim ID3(1), TAG(1)
For i=0 To 1
'Проверяем в начале файла наличие заголовка ID3v2 тэга - строки "ID3"
If AscB(MidB(f(i),1,1))=73 And AscB(MidB(f(i),2,1))=68 And AscB(MidB(f(i),3,1))=51 Then
'Длина заголовка ID3v2 тэга - 10 байт
'Последнее поле в заголовке тэга – это число, закодированное в четырех байтах, в каждом
'из которых используется лишь по семь бит,содержащее размер всего тэга без учета заголовка
ID3(i) = AscB(MidB(f(i),7,1))*2^21 + AscB(MidB(f(i),8,1))*2^14 + AscB(MidB(f(i),9,1))*2^7 + AscB(MidB(f(i),10,1)) + 10
Else
ID3(i) = 0
End If
'Проверяем в конце файла наличие заголовка расширенного тэга ID3v1 (строки "TAG+")
'размером 227 байт со смещением 128 байт с конца
If AscB(MidB(f(i),size(i)-354,1))=84 And AscB(MidB(f(i),size(i)-353,1))=65 And AscB(MidB(f(i),size(i)-352,1))=71 And AscB(MidB(f(i),size(i)-351,1))=43 Then
TAG(i) = 355
'Проверяем в конце файла наличие заголовка ID3v1 тэга (строки "TAG") размером 128 байт
ElseIf AscB(MidB(f(i),size(i)-127,1))=84 And AscB(MidB(f(i),size(i)-126,1))=65 And AscB(MidB(f(i),size(i)-125,1))=71 Then
TAG(i) = 128
Else
TAG(i) = 0
End If
Next
'Dim hash(1)
'With WScript.CreateObject("CAPICOM.HashedData")
' .Algorithm = 3
' .Hash(MidB(f(0), ID3(0)+1, size(0)-ID3(0)-TAG(0)))
' hash(0) = .Value
' .Hash(MidB(f(1), ID3(1)+1, size(1)-ID3(1)-TAG(1)))
' hash(1) = .Value
'End With
'If hash(0) = hash(1) Then
If MidB(f(0),ID3(0)+1,size(0)-ID3(0)-TAG(0)) = MidB(f(1),ID3(1)+1,size(1)-ID3(1)-TAG(1)) Then
objWSHShell.Popup "Эти файлы одинаковы:" &vbCr& File(0) &vbCr& File(1), 0, Title, 64
Else
objWSHShell.Popup "Эти файлы РАЗЛИЧАЮТСЯ:" &vbCr& File(0) &vbCr& File(1), 0, Title, 48
End If
По сравнению с предыдущей версией работает на порядок быстрее благодаря бинарномы режиму чтения файла (Stream.Type = 1). По скорости сравнение 100-Мегабайтных файлов при этом алгоритме сопоставимо со сравнением 5-Мегабайтных файлов в предыдущем случае.
Время, затрачиваемое на побайтное сравнение и вычисление хэша MD5 (закоментировано), "на глаз" примерно одинаково.
Теперь задача: пройтись рекурсивно по папке с музыкой и посчитать MD5 хэши для всех файлов.
С VBScript не знаком, так что поправьте, если что не так. И дайте, пожалуйста, ссылку на справочник по VBScript на русском (типа такого).
Кстати, обязательно удалять объекты (Set objArgs = Nothing) после использования?