Автор Тема: _FileDirList - Поиск файлов с использованием команды DIR  (Прочитано 15567 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473
  • Репутация: 332
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Цитировать
Остаётся непонятным вопрос, в маске находятся две точки, а результат содержит некоторые элементы совсем без точек.

Как бы... http://autoit-script.ru/index.php/topic,4901.0.html
Цитировать
"." - соответствует любому одиночному символу, кроме символа новой строки
Рано или поздно все станет понятно, все станет на свои места и выстроится в единую красивую схему, как кружева. Станет понятно, зачем все было нужно, потому что все будет правильно.

Русское сообщество AutoIt

Re: _FileDirList - Поиск файлов с использованием команды DIR
« Ответ #15 Отправлен: Октябрь 04, 2012, 12:26:47 »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2723
  • Репутация: 1139
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
C2H5OH
Не хочу хвастаться, но эта справка была написана после того, как я написал свою справку в RegExp, которую вы видите в официальной русской справке. Ну и второе, маска в _FileDirList не является регулярным выражением, в курсе что такое wildcards? Думаю по этому правилу в файле не может быть 2 расширения, то бишь две точки, отсюда вытекает что вторая точка либо игнорируется либо ищет по двум маскам (не тестил).

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473
  • Репутация: 332
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
AZJIO,
да, я уже понял что речь не о регулярных выражениях.
Но у меня тут такие фокус команда DIR показывает...
Ща потестю немного, напишу.


Добавлено: Октябрь 04, 2012, 16:33:12
Вот так хитро работает DIR

DOS
(нажмите для показа/скрытия)

XP
(нажмите для показа/скрытия)

Под ХР DIR 213*.* даёт в списке файлы, которые начинаются на 212. Та же самая команда в DOS в том же каталоге, даёт фантастический результат, который объясняет почему эти файлы показываются по такому шаблону. Но почему происходит такая конвертация - загадка. Файлы реально называются так как показано в ХР-шном списке.
Может и с точками похожая ерунда?
« Последнее редактирование: Октябрь 04, 2012, 16:36:32 от C2H5OH, Причина: Объединение сообщений »

Оффлайн Семёнычев Роман [?]

  • Новичок
  • *
  • Сообщений: 25
  • Репутация: 1
  • Пол: Мужской
    • Награды
используя Вашу функцию в коде, требуется использовать конструкцию

Код: AutoIt [Выделить]
$_eng = _FileDirList(@ScriptDir, '*conflicted copy*', 1)
For $i = 1 To $_eng[0]
    FileDelete($_eng[$i])
Next
 


однако, если файлов по маске найти не удалось, то вылезает ошибка

"P:\DropboxPortableAHK\Dropbox\ChromePortable\test.au3" (6) : ==> Subscript used on non-accessible variable.:
For $i = 1 To $_eng[0]
For $i = 1 To $_eng^ ERROR
->15:21:21 AutoIt3.exe ended.rc:1

и код дальше не выполняется. проблема решилась комментированием строк

If @error Or UBound($aOut) < 2 Then
        Return SetError(2, 0, 0)
EndIf

мне кажется, нужно изменить их

Русское сообщество AutoIt

Re: _FileDirList - Поиск файлов с использованием команды DIR
« Ответ #18 Отправлен: Март 30, 2014, 15:23:53 »

Оффлайн erlik [?]

  • Продвинутый
  • ***
  • Сообщений: 317
  • Репутация: 83
    • Награды
  • Версия AutoIt: 3.3.8.1
Используйте _RecFileListToArray.
Для сравнения:
_FileDirList:             30 тыс файлов - 14985 мск
_RecFileListToArray: 30 тыс файлов - 2352 мск.

_FileDirList:             100 тыс файлов - 30406 мск
_RecFileListToArray: 100 тыс файлов - 8352 мск.
Вывод вполне очевиден - лично я давно променял первую на вторую.

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2711
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
в "окошках" есть такой момент, что, если ищешь повторно, то времени нужно уже меньше. то есть, если подряд запустить две разных функции на поиск, то вторая сработает быстрее.. поэтому тесты проводить нужно в разных вариантах.
erlik
думаю, что ты так и делал.
теперь по скорости конкретных функций
_RecFileListToArray - 146843 файлов за  7.21 сек
_FO_FileSearch - 146843 файлов 3.66 сек
_FileDirList - 146162 файлов 6.89 сек
для поиска брался один и тот же диск
_FileDirList -  возвращает разное количество файлов
145963-6.54 сек
146654-7.12 сек  и так далее , что  позволяет не использовать такой метод

самая быстрая функция  - _FO_FileSearch
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн erlik [?]

  • Продвинутый
  • ***
  • Сообщений: 317
  • Репутация: 83
    • Награды
  • Версия AutoIt: 3.3.8.1
joiner
Цитировать
думаю, что ты так и делал
Да ничего особенного  :)
Код: AutoIt [Выделить]
$aData = _RecFileListToArray($sDir, $sFileMask, $iFlag, $iSubDir, 0, 2)
и
$aData = _FileDirList($sDir, $sFileMask, $iFlag, $iSubDir)

В качестве $sDir использовались разделы по 40 и 75 гигов. В качестве флагов поиска:  - поиск папок и файлов, поиск в подпапках.
_RecFileListToArray у меня всегда давала лучший результат, поэтому ее и использовал. То что _FileDirList за счет особенностей dir вторично дает более быстрый результат я в курсе, но в моем случае не аргумент: первичный поиск приоритетнее. И она, как ты сам заметил, возвращает разное количество файлов.
_FO_FileSearch особо не пользовался. Но сейчас  вставил ее в свою прогу - результат на уровне _RecFileListToArray. Но повторный поиск дает многократный (раз в 6) прирост скорости - как и у _FileDirList. Видимо как то результаты поиска сохраняются ( в реализацию функции я не углублялся). Так что что выбирать - однозначно сказать сложно.
К тому же _FO_FileSearch возвращала у меня меньшее число файлов и папок, нежели _RecFileListToArray.
ЗЫ: Ну еще не стоит забывать, что разные результаты могут быть следствием разной файловой структуры дисков, которые мы тестили.

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2711
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
erlik  [?]
Цитировать
К тому же _FO_FileSearch возвращала у меня меньшее число файлов и папок, нежели _RecFileListToArray.
у меня ни разу разницы не было. диск занят на 190Гб в нтфс
насчет скорости, в любых вариантах _FO_FileSearch выигрывает по скорости
да, забыл, _FO_FileSearch это только для поиска файлов
« Последнее редактирование: Март 30, 2014, 23:27:20 от joiner »

Русское сообщество AutoIt

Re: _FileDirList - Поиск файлов с использованием команды DIR
« Ответ #22 Отправлен: Март 30, 2014, 23:20:30 »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2723
  • Репутация: 1139
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
erlik
_FO_FileSearch и _RecFileListToArray должны выдавать одинаковое количество файлов, так как принципиальный способ детектирования файлов практически одинаков - формирование регулярного выражения. Разница в скорости только в том что _RecFileListToArray проверяет маску для каждого файла в цикле, а _FO_FileSearch сначала формирует список, а потом за один проход регулярным выражением удаляет несоответствующие маске. Вот этот "один проход" и даёт выигрыш по времени. _RecFileListToArray может выдать меньше потому что там могут отключены скрытые файлы. А вообще чтобы определить разницу достаточно получить два списка и сравнить их в программе сравнения строк. Это перво-наперво делается чтобы определить ошибки.

*conflicted copy*
вообще в справке к FileFindFirstFile сказано
Цитировать
Можно использовать только одну маску в имени файла и в его расширении, например a*.b?.
Это относится не конкретно к указанной функции, а к движку с подстановочными символами (wildcards). Фактически у меня "conflicted copy*" выдаёт тоже что и "*conflicted copy*". Поэтому видимо ошибки которые я указывал в предыдущем посте этой темы было связано с этим ограничением.

Оффлайн erlik [?]

  • Продвинутый
  • ***
  • Сообщений: 317
  • Репутация: 83
    • Награды
  • Версия AutoIt: 3.3.8.1
AZJIO
Твоя функция однозначно в лидерах.  joiner был прав - я не так тестировал.
Нужно после каждого поиска перезагружать систему (кстати joiner - твои результаты раз в 10 лучше моих, что очень странно), иначе результат следующего поиска любой функцией будет неверным (более быстрым).
Тестил теперь только на поиске файлов, так как _FO_FileSearch ищет только их, потому и разница в кол-ве была.
Итог был для меня неожиданным:
_FileDirList оказалась быстрее _RecFileListToArray. В своем первом посте я ориентировался на результаты давнишней проверки на XP, но то ли я тогда неверно тестил, то ли на семерке dir лучше работает, но получилось все наоборот.
Но _FO_FileSearch обошла обе предыдущие функции. Так что для поиска только файлов - лидер однозначен. У файл _FileDirList существенный недостаток в том, что она выдает разное число найденных файлов при каждом проходе, поэтому для поиска файлов и папок все таки _RecFileListToArray надежнее.

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2723
  • Репутация: 1139
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
erlik  [?]
Цитировать
Нужно после каждого поиска перезагружать систему
Как раз таки наоборот. При перезагрузке вы тестите не скорость функции, а скорость доступа жёсткого диска, то есть текущего состояния его кеш-памяти. Надо тестить одну и туже папку при чём первый поиск считать нетестовым а формирующим кеш, остальные запросы той же папки уже будут тестировать скорость алгоритма.

Оффлайн erlik [?]

  • Продвинутый
  • ***
  • Сообщений: 317
  • Репутация: 83
    • Награды
  • Версия AutoIt: 3.3.8.1
AZJIO
Окей. Понял. Значит тогда мои результаты близки к тем, что у joiner'а.
А скорость доступа к диску у меня действительно весьма медленная.
_FileDirList          91483  файлов   -  36464 мск,    повторно:  91486  файлов  - 5749 мск, третий проход: 91341 файлов  - 5836 мск
_RecFileListToArray   91486  файлов   - 153511 мск,    повторно:  91486  файлов  - 7737 мск, третий проход: 91486 файлов  - 7749 мск
_FO_FileSearch        91486  файлов   -  33096 мск,    повторно:  91486  файлов  - 4231 мск, третий проход: 91486 файлов  - 4226 мск

Оффлайн Семёнычев Роман [?]

  • Новичок
  • *
  • Сообщений: 25
  • Репутация: 1
  • Пол: Мужской
    • Награды
AZJIO
однако работает ) даже с двумя масками все работает и находит

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2723
  • Репутация: 1139
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Семёнычев Роман  [?]
Цитировать
однако работает ) даже с двумя масками все работает и находит
Если оно иногда работает, а иногда что-то находит - это не совсем то, что требуется любому здравомыслящему программисту. Если вас устраивает, я не против, ваше право. Если в справке указано правило, то при отклонении от этого правила Microsoft вам не гарантирует требуемого результата.

[?]
Цитировать
даже с двумя масками
Что имеется ввиду под двумя масками? Двумя подстановочными знаками или перечисление нескольких масок поиска? Если имеется подстановочные знаки, то в теории *слово* и слово* не являются  одинаковыми масками и должны находить разные результаты. Первый вариант позволяет начинаться с любого другого символа, слово может быть в конце. Второй вариант обязывает начинаться с заданного слова. Это разные маски. Если речь идёт о нескольких поисковых масок, то их поддержка объявлена в описании функции (см. пример в первом посте).
« Последнее редактирование: Апрель 01, 2014, 02:12:19 от AZJIO »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2711
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
еще раз делал сравнения функций поиска. причина - не поиск самой быстрой, а самой точной.
не буду приводить примеры других. пишу в этой теме, так как это касается функции _FileDirList
Выше уже обсуждалось, что функция возвращает разное количество файлов, что делает функцию _FileDirList совершенно непригодной к применению
я делал поиск непосредственно в ком.строке системы и все разы был правильный возврат количества файлов.
пришел к выводу, что в функции чтение из консоли неверно. точнее , при чтении не получаются те результаты, которые выдает консоль системы
я немного изменил функцию. перенаправив результаты поиска в буфер обмена. это увеличило время работы функции, но добился получения верного результата в любом случае
(нажмите для показа/скрытия)


Добавлено: Январь 10, 2015, 08:42:19
если отбросить все предубеждения, то можно работать через запись в файл
(нажмите для показа/скрытия)
тогда скорость получения результата становится вполне приемлемой
_FileDirList+Файл: Время поиска - 4218.2390564023; Количество файлов - 78633

Добавлено: Январь 10, 2015, 10:26:05
вот еще один вариант.  изменены параметры чтения из консоли и формирование результирующего массива

(нажмите для показа/скрытия)
_FileDirList: Время поиска - 3658.22131888479; Количество файлов - 78633
в итоге, в оригинале функция дает разные результаты поиска
поиск с использованием буфера обмена, запись файл, и с измененными параметрами чтения из консоли всегда дают точные результаты


Добавлено: Январь 11, 2015, 02:24:34
Хотелось бы услышать комментарии автора темы. Не для спора
« Последнее редактирование: Январь 11, 2015, 02:24:34 от joiner, Причина: Объединение сообщений »

Русское сообщество AutoIt

Re: _FileDirList - Поиск файлов с использованием команды DIR
« Ответ #29 Отправлен: Январь 10, 2015, 06:03:07 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
9 Ответов
11106 Просмотров
Последний ответ Декабрь 27, 2017, 18:16:32
от ra4o
4 Ответов
3620 Просмотров
Последний ответ Декабрь 18, 2010, 12:57:30
от Ed_Vard
9 Ответов
4493 Просмотров
Последний ответ Апрель 07, 2011, 08:22:14
от prokazzza
2 Ответов
3342 Просмотров
Последний ответ Декабрь 16, 2011, 12:47:23
от madmasles
3 Ответов
2011 Просмотров
Последний ответ Март 05, 2013, 13:22:05
от AZJIO
1 Ответов
2079 Просмотров
Последний ответ Февраль 19, 2014, 20:07:31
от Z_Lenar
0 Ответов
1094 Просмотров
Последний ответ Февраль 20, 2014, 08:45:47
от madmasles
3 Ответов
782 Просмотров
Последний ответ Январь 19, 2017, 20:29:27
от shveicar
1 Ответов
618 Просмотров
Последний ответ Октябрь 04, 2017, 07:12:37
от trudmoy
4 Ответов
860 Просмотров
Последний ответ Апрель 13, 2018, 09:47:14
от Василиса Лукьянчикова