Что нового

[Данные, строки] поиск данных в бинарном файле и их сравнение

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Здравствуйте.

Использую AutoIt 3.3.8.1

Вопрос в том, как можно осуществить поиск по шаблону в бинарном файле? Использую такой код:
Код:
#include <Array.au3>
#include <FileOperations.au3>

Dim $NoFile[1], $YESFile[1]

$aReturn = _FO_FileSearch(@AppDataDir&'\uTorrent\', "*.torrent", True, 125, 0, 2)

$hFile = FileOpen(@AppDataDir&'\uTorrent\settings.dat')
$sChars = FileRead($hFile)

For $i = 0 To UBound($aReturn) -1

	$f = _ArrayToString($aReturn, '', $i, $i)
	$g = StringRegExp($sChars, $f, 0)
   If $g = '0' Then
		_ArrayAdd($NoFile, $aReturn[$i])
	Else
		_ArrayAdd($YESFile, $aReturn[$i])
	EndIf

Next

_ArrayDisplay($NoFile, 'NO')
_ArrayDisplay($YESFile, 'YES')

FileClose($hFile)
Суть действий скрипта, это:
1) получить все файлы с расширением *.torrent в директории
2) прочитать в переменную файл настроек
3) в цикле искать совпадения и в зависимости от результата создавать два массива, первый это отсутствующие имена файлов в настройках, а второй файлы совпадающие с настройками.
4) вывести массивы на обозрение

Но почему-то поиск не срабатывает, все вносится в массив "Нет файлов". Но файлы, точнее имена файлов точно есть.
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
ivsatel
Может так надо?
Код:
#include <Array.au3>
#include <FileOperations.au3>

Dim $NoFile[1], $YESFile[1]

$aFileList = _FO_FileSearch(@AppDataDir & '\uTorrent\', "*.torrent", True, 125, 2) ; имя с расширением

; $hFile = FileOpen(@AppDataDir&'\uTorrent\settings.dat')
; $sChars = FileRead($hFile)
; FileClose($hFile)
$sChars = FileRead(@AppDataDir & '\uTorrent\settings.dat')

For $i = 1 To $aFileList[0]
	If StringInStr($sChars, $aFileList[$i]) Then ; Если путь содержится в settings.dat, то
		_ArrayAdd($YESFile, $aFileList[$i])
	Else
		_ArrayAdd($NoFile, $aFileList[$i])
	EndIf
Next

_ArrayDisplay($NoFile, 'NO')
_ArrayDisplay($YESFile, 'YES')
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
AZJIO

Нет. Тоже показывает что "NO"
Т.е. нет совпадений со списком имен файлов в директории и именами в файле настроек(
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ivsatel [?]
Вопрос в том, как можно осуществить поиск по шаблону в бинарном файле?
причем тут бинарный файл?
пример AZJIO у меня работает.
каким образом записаны имена файлов в файл настроек?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Kaster
о чтении файлов .torrent не было речи.

ivsatel [?]
1) получить все файлы с расширением *.torrent в директории2) прочитать в переменную файл настроек3) в цикле искать совпадения и в зависимости от результата создавать два массива, первый это отсутствующие имена файлов в настройках, а второй файлы совпадающие с настройками.4) вывести массивы на обозрениеНо почему-то поиск не срабатывает, все вносится в массив "Нет файлов". Но файлы, точнее имена файлов точно есть.
обычный поиск , сравнение имен найденных файлов и записанных в файл настроек
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
joiner [?]
о чтении файлов .torrent не было речи.
а, точно. почему то подумал про torrent файлы. для проверки открыл settings.dat на моем маке, непонятно, он как бинарник идет, или как текстовик, потому что кроме NULL-символов, все остальные символы обычный текст.
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Все! Получилось! Нужно было данные в массиве полученные по средствам
Код:
_FO_FileSearch
перекодировать в UTF-8.
Пример:
Код:
#include <Array.au3>
#include <FileOperations.au3>
#include <Encoding.au3>

Global $sChars

Dim $NoFile[1], $YESFile[1], $aFileList

$aFileList = _FO_FileSearch(@AppDataDir & '\uTorrent\', "*.torrent", True, 125, 2) ; имя с расширением
$sChars = FileRead(@AppDataDir & '\uTorrent\resume.dat')

For $i = 1 To $aFileList[0]
    If StringInStr($sChars, _Encoding_StringToUTF8($aFileList[$i])) Then ; Если путь содержится в settings.dat, то
        _ArrayAdd($YESFile, $aFileList[$i])
    Else
        _ArrayAdd($NoFile, $aFileList[$i])
    EndIf
Next

_ArrayDisplay($NoFile, 'Мертвые торренты')
_ArrayDisplay($YESFile, 'Живые торренты')
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
В итоге полезная вещь получается, у самого из 200 торрентов 126 не рабочие, а вручную разбираться не хочется, многие имеют одни цифры в имени.
Gui неплохо бы, а то у меня utorrent.exe находится не в "C:\Program Files" и соответственно его resume.dat находится в папке программы. Получается нужно поле выбора папки uTorrent и путь к файлу. Ну и как конечный результат - кнопку для удаления пустышек.
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
AZJIO
Сейчас как раз делаю немного шире вариант, с бэкапом профиля и т.д. :smile:
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ivsatel
ivsatel [?]
Все! Получилось! Нужно было данные в массиве полученные по средствам
у тебя все получилось. потому что ты сменил файл для чтения. в первом сообщении ты указывал в коде - settings.dat
в последнем коде читаешь уже другой файл - resume.dat
и ошибка твоя была именно в этом. почему ты получал один массив пустой. то есть массив живых торрентов.
надо читать файл - resume.dat
кстати, у меня и без
Код:
_Encoding_StringToUTF8($aFileList[$i])

работает правильно разделение на живые и мертвые торренты.
одна ошибка всего лишь. то есть в рабочих торрентах нет одного. но в целом срабатывает.
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
joiner
joiner сказал(а):
у тебя все получилось. потому что ты сменил файл для чтения. в первом сообщении ты указывал в коде - settings.dat
Да, верно.
joiner сказал(а):
кстати, у меня и без
Код: AutoIt [Выделить]
Код:
_Encoding_StringToUTF8($aFileList[$i])

работает правильно
А имена с русскими символами есть?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
та ошибка, что я упомянул, как раз имя торрента было на русском. торрент не был учтен как работающий.
получается, нужно использовать
Код:
_Encoding_StringToUTF8
 
Верх