Что нового

Функция для поиска файлов на диске по нестандартному шаблону

  • Автор темы Безымянный_герой
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Б

Безымянный_герой

Гость
Здравствуйте, товарищи!
Требуется написать функцию для рекурсивного поиска на диске файлов, чьи имена совпадают с шаблоном. Искать нужно только файлы, с расширениями "*.exe" либо вовсе без расширений. От функции требуется максимум(!!!)селективности. Функция должна возвращать массив с полными путями совпавших файлов.

пример.

шаблон="targetpath\extndfilename";

//функция должна вернуть:
1.C:\somefoldername\targetpath\extndfilename
2.C:\somefoldername\targetpath\extndfilename.exe

в папке C:\somefoldername находились: extndfilename, extndfilename.mp3, extndfilename.exe, extndfilename.jpg;

в других папках(на том же диске) находились файлы с именами: "extndfilename.exe"(их не трогать)

Данная функция-часть моей недописанной программы, которая будет направлена во благо и должна поднять авторитет Autoit.
Человек, который поможет мне с функцией, будет вознагражден!
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Безымянный_герой
Посмотри _FileSearch. Задача проста, получаешь список всех файлов, далее регулярным выражением извлекаешь из списка нужное. Пример регулярных выражений есть в самой функции, например для возврата только имён или для инвертирования. Задача сводится всего лишь к составлению регулярного выражения.
 
Автор
Б

Безымянный_герой

Гость
Спасибо, но в том-то и дело, что я не могу составить регулярное выражение. ((




Добавлено:
Сообщение автоматически объединено:

может кто подскажет: как сравнить 2 строки с шаблоном и выдать результат, в какой из строк совпадений найдено больше?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Безымянный_герой

Ну вот первые плоды

Код:
#include <Array.au3> ; для _ArrayDisplay
#include <_FileSearch.au3>

$FileList=_PathSearch('C:\WINDOWS\system', '*ystem\m*|*ystem\*z*|*ystem\o*', True, 125)
; $FileList=_GetListMask('C:\WINDOWS\system', '*ystem\M*', False, 125)
MsgBox(0, 'Сообщение', $FileList)
$FileList = StringSplit($FileList, @CRLF, 1)
_ArrayDisplay($FileList, UBound($FileList)&' - RegExp')

; Получение списка и обработка регулярным выражением
Func _PathSearch($Path, $Mask, $Include, $Depth)
	Local $aFileList, $FileList
	$FileList=_FileSearch($Path, '*', True, $Depth, 1, 0)
	$Mask = StringReplace(StringReplace(StringRegExpReplace($Mask, '[][$^.{}()+\\]', '\\$0'), '?', '.'), '*', '.*?')
	If $Include Then
		$aFileList = StringRegExp($FileList, '(?mi)^(' & $Mask & ')(?:\r|\z)', 3)
		$FileList = ''
		For $i = 0 To UBound($aFileList) - 1
			$FileList &= $aFileList[$i] & @CRLF
		Next
	Else
		$FileList = StringRegExpReplace($FileList & @CRLF, '(?mi)^(' & $Mask & ')\r\n', '')
	EndIf
	$FileList = StringReplace(StringTrimRight($FileList, 2), '|', '')
	Return $FileList
EndFunc
 
Автор
Б

Безымянный_герой

Гость
подожди-подожди, AZJIO, я кажется, нашел ответ на свой вопрос. Скажи, как сравнить 2 строки с шаблоном и выдать результат, в какой из строк совпадений найдено больше?

например, шаблон-e:\windows\system33\vinilplast_forever.scr

как из строк
e:\windows\system33\vinilplast.exe
e:\windows\system33\vinil.exe
e:\windows\system33\forever.scr
e:\windows\system33\vinilplast_forever.scr

выбрать строку e:\windows\system33\vinilplast_forever.scr ??
Подскажи, ты же гуру !..
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Я с вас фигею, пацаны!
http://autoit-script.ru/autoit3_docs/functions/FileFindFirstFile.htm
 
Автор
Б

Безымянный_герой

Гость
О боги! При чем тут FindFirst, массив файлов УЖЕ получен. Стоит вопрос, как сравнить их названия с шаблоном.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
C2H5OH
Я с вас фигею, пацаны!
Требуется написать функцию для рекурсивного поиска на диске файлов.
Заявленная ссылка ищет в указанной папке... давно уже старше чем пацаны.

Безымянный_герой
На форуме принято один вопрос одна тема. И поиск юзай, много тем написано о сравнении строк. Регулярное выражение выдаёт по указаному шаблону.
 
Автор
Б

Безымянный_герой

Гость
Я бросаю изучение autoit. Автоит предоставляет широкие возможности, но и опасен он как раз из-за своих широких возможностей. Сплошное шаблонное мышление. Пора переходить на делфи. Так как мое поведение может со стороны выглядеть как предательство, ради успокоения гнева скриптеров прошу модераторов дать мне бан.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Безымянный_герой [?]
Пора переходить на делфи
Удачи в этом...

может со стороны выглядеть как предательство
Да нет, при чём здесь предательство, я бы и сам перешёл на что-то более совершенное (конечно же не на дельфи, т.к считаю что выбор не из лучших), но у меня нет на это времени.

ради успокоения гнева скриптеров прошу модераторов дать мне бан
Не нужно, я думаю ты сюда ещё вернёшься ;)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А вот я, можно сказать, перешел на AutoIt именно с Delphi.

:smile:

Перешел бы на C, но тоже времени нет.



Добавлено:
Сообщение автоматически объединено:

Безымянный_герой сказал(а):
например, шаблон-e:\windows\system33\vinilplast_forever.scr

как из строк
e:\windows\system33\vinilplast.exe
e:\windows\system33\vinil.exe
e:\windows\system33\forever.scr

выбрать строку e:\windows\system33\vinilplast_forever.scr ??

Неправильное понимание или формулирование задачи ведет к большим разочарованиям. Если ты еще здесь, то поясни что именно ты хочешь сделать.

"e:\windows\system33\vinilplast_forever.scr" - это не шаблон, а полный путь к файлу. Шаблон может выглядеть так:

"e:\windows\system33\vinilplast*.???"

или

"e:\windows\system33\*forever.???"
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Безымянный_герой
Вам не StringInStr() Случайно нужен? Если чем то не подходит, скажите хоть чем - так будет проще написать регулярное выражение.
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
OffTopic:
Yashied [?]
А вот я, можно сказать, перешел на AutoIt именно с Delphi.
smiley.gif
Перешел бы на C, но тоже времени нет

ха-ха я тоже после пару уроков в школе паскаля хотел самостоятельно освоить делфи но, в то время не было таких подробных руководств как сейчас да и инет был чем то ого-го, так что *.bat *rarsfx *zipsfx - хватало для нужд, но потом надо было стало больше, в итоге случайно столкнулся с AutoiT на форуме OSzone - он то и стал золотой серединой "время-результат", а вообще хочу С/C++ Net ну и много чего еще но AutoIT бы хоть на уровне уверенного скриптера освоить ))))
 
Автор
Б

Безымянный_герой

Гость
О, и Криэйтор С Яшидом почтили нас своим присутствием! Где ж вы раньше были, золотые мои! Я писал антивирус для флешек, все нервы с ним вымотал, а помочь никто не захотел(или не сумел). Короче так. При подключении флешки, если на ней есть файл авторан инф, функция считывает его содержимое , и проверяет, есть ли на флешке папки с такими именами(stringregexp,stringinstr, увеличивает скорость выполнения). Затем происходит анализ схожести имен файлов из массива на соответствие указанным в авторане. при соответствии, файл будет переименован(лишен расширения) и перемещен в псевдо-карантин. Я пользуюсь функцией, которая ищет в файле autorun.inf ключи "shellexecute","shell\explore\command","shell\open\command" и возвращает содержащиеся в них строки. Очевидно, я неправильно составил функцию для разбора этой строки, т.к. получилось очень ненадежно, функция капризничает, хватает лишнее. Единственное, чего я добился-снизил нагрузку на процессор и увеличил время проверки (Не секрет, что рекурсивный поиск файлов сильно грузит процессор, в примерах, указанных на сайте - почти на 88-90%.Кошмар.) У меня процессор грузился всего на 1-5 %(кратковременно), а массив файлов заполнялся почти мгновенно.


Добавлено:
Сообщение автоматически объединено:

Пытаться как-то разбирать строку автозапуска бесполезно, ее можно закриптовать так, что в глазах потемнеет.

пример.
[shellexecute=] cmd /c cmd /c cmd /c wscript.exe.E:vbs ,.,
[shellexecute=] rundll32 .\common,virprocedure
[shellexecute=] cmd /c 1.jpg -autorun (при этом -autorun может быть как пар.ком.строки, так и имя запускаемого файла.)
[shellexecute=] cmd /c solo (в папке находятся файлы: solo.exe, solo.jpg,solo.mp3, запустится по правилу приоритета-solo.exe)

и т.п (Это просто примеры, по ним ничего не надо писать)
Имя вирусного файла может быть километровым, а может его и вовсе не быть(shellexecute=.\.exe)

Нужно не строку расшифровывать, а проверять именно массив файлов(сначала грубо-просто stringregexp, а затем более тонко.) Но как это сделать?


Добавлено:
Сообщение автоматически объединено:

Вся ваша проблема в том, что вы слишком добрые, "бархатные" программисты. Добродушный программист-овца. Кодер должен быть волком. Начните писать вредоносные программы, просто, для себя, на виртуалке. Вам откроется целый фантастический мир особенностей системы, вы научитесь правильно работать с политиками безопасности(и исчезнут наивные вопросы типа почему скрипт на VISTA/7 не копируется в системные папки, или не добавляется в реестр.) Когда я начинаю учить новый язык, оцениваю его возможности просто-пишу червя или вирус. Если мне это удается, я начинаю учить язык. И с автоитом было так. Я написал огромное количество вирья, НО за пределы моей виртуалки ни один не вышел. Люди начинают свое знакомство с прораммированием с программки Hello,world, а я в первый паз написал червя-автораннера. Это было в 2008, когда я учил VBS. Я это делал просто ради удовольствия. Через написание вируса должен пройти любой программист.


Добавлено:
Сообщение автоматически объединено:

Надобно сказать, что я вовсе не одобряю тех, кто пишет червей ради вреда.В принципе ради противодействия этому явлению я и начал писать свою утилитку. Но встрял. Я декомпилировал миллионы червей,на автоите. Пишут их в основном, полуидиоты либо самоучки. Поддержка Gui, широкие возможности работы с системой, да что там-Си, переписанный на бейсик-просто грех на таком языке вирье писать. Язык автораннеров-VB javascript:void(0);
 
Автор
Б

Безымянный_герой

Гость
Вот нашел функцию scrolling string. Может, кому нибудь будет полезна.

Код:
#include<timers.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
global $left=600
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("", 575, 442, 192, 124)
$Label1 = GUICtrlCreateLabel("", 0, 0, 572, 33)
$Label2 = GUICtrlCreateLabel("ewriuweriuweyriuewyriuewyiruweyru", 312, 8, 252, 17)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
_Timer_SetTimer($Form1,10,"_m")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd




func _m($hWnd, $Msg, $iIDTimer, $dwTime)
GUICtrlSetPos($Label2,$left,8,252,17)
$left=$left-1
if $left < -100 then $left=600
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Безымянный_герой [?]
и Криэйтор С Яшидом почтили нас своим присутствием
А ты будь так добр, писать ник так, как он присутствует на форуме.
Тебе же не будет приятно если я напишу Bezimyanny_geroy? :smile:

Не так, тема давно решена. Если есть другие вопросы, прошу в другую тему, а лучше начни интенсивно читать справку и пользоваться поиском по форуму.

Вся ваша проблема в том, что вы слишком добрые, "бархатные" программисты. Добродушный программист-овца. Кодер должен быть волком. Начните писать вредоносные программы, просто, для себя, на виртуалке. Вам откроется целый фантастический мир особенностей системы
Тебе предупреждение за нарушение правил форума (п. А.5)...
Предупреждение Запрещается создавать темы/сообщения или ссылки на сайты, связанные с нарушением IT безопасности. В это входит публикация и распространение вирусов и любых программ, несущих потенциальный вред программному и аппаратному обеспечению компьютера.


И я тебе скажу так, я без написания вредоносных программ открыл для себя целый мир особенностей системы.

начал писать свою утилитку. Но встрял
Забавно что после написания червя, есть ещё какие то проблемы с кодингом...

[?]
Вот нашел функцию scrolling string. Может, кому нибудь будет полезна.
Если не заметил, тут форум а не чат.

Тема закрыта.
 
Статус
Закрыто для дальнейших ответов.
Верх