|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Рекурсивный поиск файла |
|
[решено] Рекурсивный поиск файла
|
Новый участник Сообщения: 31 |
Профиль | Отправить PM | Цитировать
Поиск файла выполняется при помощи функции, и выполняется очень долго. Возможно ли реализовать поиск файла в каталогах и подкаталогах другим способом - более быстрым?
Func _FindFiles($sRoot, $sFile) Local $FileList $FileList = _FileListToArray($sRoot, $sFile, 1) If Not @error Then For $i = 1 To $FileList[0] $filename2 = StringMid($Filelist[$i],StringInStr($Filelist[$i],"\",0,-1)+ 1) MsgBox(64,"",$filename2) Next EndIf $FileList = _FileListToArray($sRoot, '*', 2) If Not @error Then For $i = 1 To $FileList[0] _FindFiles($sRoot & '\' & $FileList[$i], $sFile) Next EndIf EndFunf Func FileSearch($sPath, $sFileSrh) ;путь к каталогу и имя файла Local $sFile, $Search, $sRes = "" While 1 $Search = FileFindFirstFile($sPath & "\" & $sFileSrh) If @error Then Return "" While 1 $sFile = FileFindNextFile($Search) If @error Then ExitLoop $sFile = $sPath & "\" & $sFile If StringInStr(FileGetAttrib($sFile), "D") > 0 Then ContinueLoop $sRes = $sFile MsgBox(64,"",$sRes) WEnd FileClose($Search) $Search = FileFindFirstFile($sPath & "\*.*") If @error Then ExitLoop While 1 $sFile = FileFindNextFile($Search) If @error Then ExitLoop $sFile = $sPath & "\" & $sFile If StringInStr(FileGetAttrib($sFile), "D") = 0 Then ContinueLoop $sRes = FileSearch($sFile, $sFileSrh) If $sRes <> "" Then ExitLoop 2 WEnd ExitLoop WEnd FileClose($Search) Return $sRes EndFunc Можно ли организовать поиск файла через WinAPI? |
|
Отправлено: 10:37, 20-01-2010 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать Мне понадобилось запустить все регфайлы в @ScriptDir & "\*\*\*....... рекурсивноооо
Как всегда ничего приличного не нашёл и был очень зол Заодно поглядел что есть из файнд файл и примеров гугл, и там тоже громадные скрипты для такой простой задачи. :\ Хотя понмиаю, это у меня прстая задача, конечно там видимо что-то более серьёзное... ?? |
------- Отправлено: 17:51, 20-01-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать #include <Array.au3> $aReturn = _FileSearch(@WindowsDir, "File\....$", 0) _ArrayDisplay($aReturn) Func _FileSearch($sPath, $sRegExp_FileMask, $iCaseSense=0) Local $iPID, $sStdOutRead, $aRet, $sFindStr, $sCaseStr If Not $iCaseSense Then $sCaseStr = ' /I' $sFindStr = 'Dir "' & $sPath & '" /S /B | FindStr' & $sCaseStr & ' /R "' & $sRegExp_FileMask & '"' $iPID = Run(@ComSpec & ' /C ' & $sFindStr, @SystemDir, @SW_HIDE, 2) While 1 $sStdOutRead &= StdoutRead($iPID) If @error <> 0 Then ExitLoop WEnd $aRet = StringSplit(StringStripCR(StringStripWS($sStdOutRead, 3)), @LF) Return SetError(@error, 0, $aRet) EndFunc Цитата cra5h_:
|
|
------- Отправлено: 00:48, 21-01-2010 | #3 |
Новый участник Сообщения: 31
|
Профиль | Отправить PM | Цитировать Такс, коллекция скриптов с рекурсивным поиском пополняется. первыми двумя способами файл ищется 14-16 сек, последним способом 49-52 о_О
|
Отправлено: 10:28, 21-01-2010 | #4 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата cra5h_:
P.S А имя файла точное, или нужен поиск по маске? Возможно замедление из за поиска используя регулярные выражения. |
||
------- Отправлено: 10:34, 21-01-2010 | #5 |
Новый участник Сообщения: 31
|
Профиль | Отправить PM | Цитировать имя файла задаю полное, файл в папках существует такой только один. виндовым поиском ищет до 10 сек
|
Отправлено: 10:37, 21-01-2010 | #6 |
Новый участник Сообщения: 31
|
Профиль | Отправить PM | Цитировать забросил поиск решения об быстром поиске файла. Подскажите как остановить функцию поиска файла после того как файл найден, потому как при нахождении файла функция продолжает сканировать остальные папки.
|
Последний раз редактировалось cra5h_, 21-01-2010 в 11:29. Отправлено: 11:18, 21-01-2010 | #7 |
Старожил Сообщения: 206
|
Профиль | Отправить PM | Цитировать Цитата cra5h_:
#Include <File.au3> Func _FindFiles($sRoot, $sFile) Local $FileList $FileList = _FileListToArray($sRoot, $sFile, 1) If Not @error Then For $i = 1 To $FileList[0] $filename2 = StringMid($FileList[$i], StringInStr($FileList[$i], "\", 0, -1) + 1) MsgBox(64, "", $filename2) Return 1 Next EndIf $FileList = _FileListToArray($sRoot, '*', 2) If Not @error Then For $i = 1 To $FileList[0] If _FindFiles($sRoot & '\' & $FileList[$i], $sFile) Then Return 1 EndIf Next EndIf Return 0 EndFunc ;==>_FindFiles _FindFiles('C:\', '*.au3') |
|
Отправлено: 12:47, 21-01-2010 | #8 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата cra5h_:
#include <array.au3> $a = _FileFindLike("spuninst.exe", "C:\\WINDOWS\\$") _ArrayDisplay($a) Func _FileFindLike($strRight, $strLeft = @HomeDrive, $sComputer = ".") Local $arrRight= StringRegExp($strRight, "^(.*?(?:\.([^.\\]*))?)$", 3) If Not(IsArray($arrRight)) Then Return SetError(1, 1) Local $arrLeft = StringRegExp($strLeft , "^([A-Za-z]:)(.*)", 3) If Not(IsArray($arrLeft)) Then Return SetError(1, 2) Local $strDrive = $arrLeft[0], $strPath = $arrLeft[1] Local $strName = $arrRight[0], $strExtn = "" If UBound($arrRight)=2 Then $strExtn = $arrRight[1] Local $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2") If Not(IsObj($objWMI)) Then Return SetError(2, 1, "") Local $strQuery = 'SELECT * FROM CIM_DataFile WHERE Drive="'& $strDrive & _ '" AND Extension="'& $strExtn &'" AND Path LIKE "'& $strPath & _ '%" AND Name LIKE "%'& $strName &'"' Local $arrRes[1] = [0], $colItems = $objWMI.ExecQuery($strQuery) If Not(IsObj($colItems)) Then Return SetError(2, 2, "") For $objItem In $colItems $arrRes[0]+=1 ReDim $arrRes[$arrRes[0]+1] $arrRes[$arrRes[0]]=$objItem.Path Next Return $arrRes EndFunc |
|
Отправлено: 13:15, 21-01-2010 | #9 |
Новый участник Сообщения: 31
|
Профиль | Отправить PM | Цитировать работает пасиба
|
Отправлено: 13:20, 21-01-2010 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Поиск файла на компьютере | sashadeg | AutoIt | 12 | 30-01-2010 18:40 | |
Разное - [решено] Поиск по типу файла | 7human7 | Microsoft Windows 7 | 2 | 25-11-2009 09:51 | |
Интерфейс - [решено] Быстрый поиск | TEMA5 | Microsoft Windows 7 | 7 | 07-10-2009 20:42 | |
CMD/BAT - [решено] Как скопировать имя файла из текстового файла в код батника и т.д. | Nun-Nun | Скриптовые языки администрирования Windows | 6 | 13-05-2009 13:28 | |
Разное - [решено] поиск файлов | zai | Microsoft Windows 2000/XP | 20 | 07-10-2007 14:18 |
|