Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Рекурсивный поиск файла

Ответить
Настройки темы
[решено] Рекурсивный поиск файла

Новый участник


Сообщения: 31
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: cra5h_
Дата: 20-01-2010
Поиск файла выполняется при помощи функции, и выполняется очень долго. Возможно ли реализовать поиск файла в каталогах и подкаталогах другим способом - более быстрым?

Код: Выделить весь код
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
файлов около 5000 и больше в 50 папках

Можно ли организовать поиск файла через WinAPI?
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:37, 20-01-2010

 

Аватара для semiono

Ветеран


Сообщения: 822
Благодарности: 33

Профиль | Отправить PM | Цитировать


Мне понадобилось запустить все регфайлы в @ScriptDir & "\*\*\*....... рекурсивноооо
Как всегда ничего приличного не нашёл и был очень зол
Заодно поглядел что есть из файнд файл и примеров гугл, и там тоже громадные скрипты для такой простой задачи. :\
Хотя понмиаю, это у меня прстая задача, конечно там видимо что-то более серьёзное...
??

-------
Полезное сообщение


Отправлено: 17:51, 20-01-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008

Профиль | Сайт | Отправить 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_:
Можно ли организовать поиск файла через WinAPI »
Врядли оно будет быстрее (в AutoIt).

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 00:48, 21-01-2010 | #3


Новый участник


Сообщения: 31
Благодарности: 1

Профиль | Отправить PM | Цитировать


Такс, коллекция скриптов с рекурсивным поиском пополняется. первыми двумя способами файл ищется 14-16 сек, последним способом 49-52 о_О

Отправлено: 10:28, 21-01-2010 | #4


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008

Профиль | Сайт | Отправить PM | Цитировать


Цитата cra5h_:
первыми двумя способами файл ищется 14-16 сек, последним способом 49-52 »
Ну так в чём проблема, первый способ значит быстрее .

P.S
А имя файла точное, или нужен поиск по маске? Возможно замедление из за поиска используя регулярные выражения.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 10:34, 21-01-2010 | #5


Новый участник


Сообщения: 31
Благодарности: 1

Профиль | Отправить PM | Цитировать


имя файла задаю полное, файл в папках существует такой только один. виндовым поиском ищет до 10 сек

Отправлено: 10:37, 21-01-2010 | #6


Новый участник


Сообщения: 31
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось cra5h_, 21-01-2010 в 11:29.


Отправлено: 11:18, 21-01-2010 | #7


Аватара для Yashied

Старожил


Сообщения: 206
Благодарности: 88

Профиль | Отправить 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
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата cra5h_:
коллекция скриптов с рекурсивным поиском пополняется »
тогда до кучи, вариант через WMI:

Код: Выделить весь код
#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
Благодарности: 1

Профиль | Отправить PM | Цитировать


работает пасиба

Отправлено: 13:20, 21-01-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Рекурсивный поиск файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Поиск файла на компьютере 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




 
Переход