Что нового

[Файловая система] Одновременный поиск файлов по двум маскам

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
gregaz [?]
Предполагаю ,что при первичном поиске инфа куда-то заносится и при повторном поиске используется
да. заносится в кэш. для опустошения кэша необязательно перегружать машину. в силу ограниченности размера, там только свежие записи. однако, можно это сделать и вручную. гугл должен помочь. под виндой давно не сижу, уже забыл названия
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles [?]
Мне непонятно другое, вариант с командной строкой находит у меня на 3 файла больше, почему?

Странно . У меня тоже на 3 больше.
Поиск выполнялся всех файлов "*.au3"

Выяснилось:
В найденное попал файл :

BaseProjectDefinition.au3proj
а также 2 папки имевшие ошибочное имя с расширением .au3 (Bass.au3)

Скрипт же от Azijo их пропускал, как и положено
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Стандартный поисковик Windows'a тоже находит папку с названием bass.au3, может нужно проверку после поиска ставить или сортировку файлов от папок

К стати, проверил я скрипт, он папку эту не принимает за файл а выводит правильное количество искомых файлов.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Viktor1703 [?]
Стандартный поисковик Windows'a тоже находит папку с названием bass.au3, может нужно проверку после поиска ставить или сортировку файлов от папок

Дествительно
И также находит файл : BaseProjectDefinition.au3proj
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Скорее всего поисковик ищет так *****.au3**.lnk , где * - не важно какой символ, главное чтоб в названии файла присутствовала точка с искомым расширением (словом).
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Viktor1703 [?]
К стати, проверил я скрипт, он папку эту не принимает за файл а выводит правильное количество искомых файлов.

У меня же получилось количество именно на 3 больше.
Я записал их в файлы и выявил сравнением (в Total Commander'e )
Именно в этих строках различие

Может это поведение поисковика и есть правльно.
Лучше найти больше.Отсеять лишнее всегда можно
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Сейчас ещё раз проверил, я создал папку, в ней создал скрипт *.au3 и папку с названием 3.au3, тест показал правильный результат, 1 файл, сейчас попробую в той же папке создать файл с расширением *.au3tag

Всё ясно, папку он не считал а вот файл с расширением *.au3tag он тоже заносит в список, а значит нужно ещё делать фильтр по количеству символов в расширении файлов, то есть если ищем *.au3 то скрипт должен искать файлы у которых после точки слово au3 и не больше 3х символов, а всё остальное отсекать.


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

Вообщем у меня получилось отсеять, но тогда скрипт пригодный только для поиска того у чего есть расширение.

Код:
#include <Array.au3>

$iStart = TimerInit()
$aReturn = _FileSearch(@ScriptDir & "\1\", '*.au3|*.txt', 1)
$sTime = StringFormat('%.2f sec', TimerDiff($iStart) / 1000)
_ArrayDisplay($aReturn, $sTime)

Func _FileSearch($s_Path_Search, $s_File_Mask = '*', $i_Flag = 0, $i_SubDir = 1)

    Local $s_Out, $a_Out, $s_Read, $h_Dir, $s_Attrib, $s_Subdir, $s_Parameter, $a_Masks

    If StringRight($s_Path_Search, 1) == '\' Then
        $s_Path_Search = StringTrimRight($s_Path_Search, 1)
    EndIf
    $a_Masks = StringSplit($s_File_Mask, '|')
	
    For $i = 1 To $a_Masks[0]
        $s_Parameter &= '"' & $s_Path_Search & '\' & $a_Masks[$i] & '";'
    Next
    $s_Parameter = StringTrimRight($s_Parameter, 1)
	
    If $i_SubDir Then
        $s_Subdir = ' /S /B'
    Else
        $s_Subdir = ' /B'
    EndIf
    Switch $i_Flag
        Case 1
            $s_Attrib = ' /A-D'
        Case 2
            $s_Attrib = ' /AD'
        Case Else
            $s_Attrib = ' /A'
    EndSwitch
    $s_Parameter &= $s_Subdir & $s_Attrib
    $s_Out = StringToBinary('0' & @CRLF, 2)
    $h_Dir = Run(@ComSpec & ' /U /C DIR ' & $s_Parameter, @SystemDir, @SW_HIDE, 6)
    If Not $h_Dir Then Return SetError(1)
    While 1
        $s_Read = StdoutRead($h_Dir, False, True)
        If @error Then
            ExitLoop
        EndIf
        If $s_Read Then
            $s_Out &= $s_Read
        EndIf
        Sleep(10)
    WEnd
    $a_Out = StringRegExp(BinaryToString($s_Out, 2), '[^\r\n]+', 3)

    If @error Then Return SetError(1)
    $a_Out[0] = UBound($a_Out) - 1
	Local $a_OutFilter[1] = [0]
	For $i = 1 To $a_Out[0]
		$a_Del = StringSplit($a_Out[$i], ".")
		If StringRegExp($s_File_Mask, $a_Del[$a_Del[0]]) = 1 Then
			$a_OutFilter[0] += 1
			ReDim $a_OutFilter[$a_OutFilter[0]+ 1]
			$a_OutFilter[$a_OutFilter[0]] = $a_Out[$i]
		EndIf	
		;ConsoleWrite($a_Del[$i] & @CRLF)
	Next	
    Return $a_OutFilter
EndFunc
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Этот путь намного замедлит поиск.
Пусть уж будет как есть
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
madmasles
Перед каждой проверкой перезагружался и запускал поиск через одну минуту
На мой взгляд это как раз ошибочный тест, так как в данном случае скорость зависит от скорости доступа к файлам на текущем состоянии (от текущего кэша), а не от производительности алгоритма. Нужно запускать один и тот же поиск несколько раз повторно с этими же критериями поиска. Первый запуск не всчёт, на основе вторых можно определить скорость и при этом не учитывать случая когда паралельно система что-то выполнить. У меня к примеру скрипт первый раз проверил 6 сек, последующие 4.05 сек, в то время как CMD-вариант не мог перейти грань менее 4.1 сек. Проверял не менее 6 раз, 3 раза не показатель при условии близких выходных значений. Кстати тестировал с двумя и с тремя расширениями при 20 000 файлов на выходе.
 

Илья_Kai

Новичок
Сообщения
1
Репутация
0
Ничего неможет найти , а результат равен 0 , в чём может быть причина?
Например пишу :
$s_Path_Search ='C:\Program Files\*'
FileWrite('C:\Documents and Settings\Admin\Рабочий стол\Илья\1.txt',_FileSearch($s_Path_Search))
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Илья_Kai [?]
результат равен 0 , в чём может быть причина?
В том что функция возвращает массив.


Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Администратор.
 
Верх