Автор Тема: Поиск файлов на диске  (Прочитано 11575 раз)

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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Поиск файлов на диске
« Создано: Октябрь 11, 2009, 06:55:07 »
Функция ищет файл(ы) по маске в указанной корневой директории и всех ее субдиректориях и выводит информацию в консоль. Ну прям как поиск в Windows. Используется рекурсия.


Код: AutoIt [Выделить]
#Include <File.au3>

_FindFiles('C:', '*.txt')

Func _FindFiles($sRoot, $sFile)

    Local $FileList

    $FileList = _FileListToArray($sRoot, $sFile, 1)
    If Not @error Then
        For $i = 1 To $FileList[0]
            ConsoleWrite($sRoot & '\' & $FileList[$i] & @CR)
        Next
    EndIf
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf
EndFunc   ;==>_FindFiles

« Последнее редактирование: Октябрь 11, 2009, 07:07:04 от CreatoR »


Думай, прежде чем говорить.

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

Поиск файлов на диске
« Отправлен: Октябрь 11, 2009, 06:55:07 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Поиск файлов на диске
« Ответ #1, Отправлен: Август 30, 2010, 06:14:28 »
Метод побыстрее, плюс возможность указать более одного фильтра (маска), и поддержка опций как в функций «_FileListToArray»:

Код: AutoIt [Выделить]
#include <Array.au3>

$aReturn = _FileSearch(@DesktopDir, "*.txt;*.htm")
_ArrayDisplay($aReturn)

;$iFlag = 0 - Файлы и папки (по умолчанию)
;$iFlag = 1 - Только файлы
;$iFlag = 2 - Только папки
Func _FileSearch($sPath, $sFileMask, $iFlag = 0)
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib
   
    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2
            $sAttrib = ' /AD'
        Case Else
            $sAttrib = ' /A'
    EndSwitch
   
    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')
   
    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
       
        While 1
            $sRead = StdoutRead($hDir, False, True)
           
            If @error Then
                ExitLoop
            EndIf
           
            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next
   
    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
   
    If @error Then
        Return SetError(1)
    EndIf
   
    $aOut[0] = UBound($aOut)-1
    Return $aOut
EndFunc



Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
Re: Поиск файлов на диске
« Ответ #2, Отправлен: Август 30, 2010, 07:58:08 »
CreatoR  [?]
Цитировать
Метод побыстрее,
Действительно скорость выше в 2-3 раза

Самая большая проблема – её сформулировать. 

Оффлайн alexnasa [?]

  • Новичок
  • *
  • Сообщений: 47
  • Репутация: 0
    • Награды
Re: Поиск файлов на диске
« Ответ #3, Отправлен: Ноябрь 10, 2010, 11:22:01 »
Помогите новичку!
Нужно (неспешно) написать код для слежения за своевременным-регулярным пополнением жёсткого диска свежими файлами-архивами (удаленный ПК, сеть без домена). Должно работать либо автоматич. режимом (напр. посылать аларм об отсутствии вот уже целый час свежих файлов в такой-то папке ), либо хотя бы просто создавать-показывать отчет о самых свежих файлах (оператор сам сравнит со своими часами -не староват ли час у самых свежих файлов и будет следить за их молодостью в отчетах любой формы)
Задача для меня не слишком "горит" потому, что в самой важной из программ, за которыми нужно следить(оч редко, но подвисает), я отыскал внутри интерфейса настроек окошко-перечень-отчет списком с датами (до минут!) и написал "открывать это окно и делать скрииншот", кот. далее оценит оператор.
Но надо бы придумать и для остальных случаев универсальную систему слежения.

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

Re: Поиск файлов на диске
« Ответ #3 Отправлен: Ноябрь 10, 2010, 11:22:01 »

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Поиск файлов на диске
« Ответ #4, Отправлен: Ноябрь 10, 2010, 11:40:06 »
alexnasa
1. твой вопрос практически не связан с данной темой. т.к. нужно допиливать много чего.
2. если у тебя есть наработки, то не стесняйся выкладывать, тебе помогут их довести до ума. но тогда твой пост придется перенести в отдельную тему в разделе для новичков
3. если у тебя нет наработок, и ты хочешь чтобы тебе сделали этот скрипт, то твой пост надлежит перенести в раздел "Стол заказов" с соответствующим правилам оформлением.
как видишь, так или иначе нужная новая тема. предлагаю тебе самому создать эту тему в нужном тебе разделе.
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Оффлайн alexnasa [?]

  • Новичок
  • *
  • Сообщений: 47
  • Репутация: 0
    • Награды
Re: Поиск файлов на диске
« Ответ #5, Отправлен: Ноябрь 10, 2010, 21:47:23 »
Гмм.. Название темы "поиск файлов на диске". Даны примеры поиска по маске расширения. А мне надо найти файл по признаку "самый молодой". Уважаемый dwerf в одном из ответов (Re: сортировка массива или FileListToArray упорядоченный по дате изменения) приводил код, который мне почти что подходит. но его нужно немного поправить. Задача моя не уникальная. Многим может понадобиться такая полезняшка на случай, если программа "залипла" и перестала писать на диск. Не проверять же, вручную листая архивы, каждый час(год).

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Поиск файлов на диске
« Ответ #6, Отправлен: Ноябрь 10, 2010, 22:23:56 »
alexnasa
с чем связано нежелание создать новую тему? в этой, как видишь, нет ответов от dwerf

Оффлайн alexnasa [?]

  • Новичок
  • *
  • Сообщений: 47
  • Репутация: 0
    • Награды
Re: Поиск файлов на диске
« Ответ #7, Отправлен: Ноябрь 11, 2010, 15:38:10 »
Мне просто нравится работа кода №2 в этом посте. Под свою задачу я добавил в него _ArraySort. И теперь он в окне мне показывает список из 28-ми самых свежих файловых дат. Осталость только отбить это окно в файл-скрииншот и оставить его лежать на шареном ресурсе в качестве документа-фотоотчета для ревизора-оператора (мол 28 самых свежих файлов мы имеем вот за эту дату-время).

Код: AutoIt [Выделить]
#Include <File.au3>
#Include <Array.au3>

$aReturn = _FileSearch(@WindowsDir, "*.txt")
;_ArrayDisplay($aReturn)

;$iFlag = 0 - Файлы и папки (по умолчанию)
;$iFlag = 1 - Только файлы
;$iFlag = 2 - Только папки
Func _FileSearch($sPath, $sFileMask, $iFlag = 1)
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib
   
    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2
            $sAttrib = ' /AD'
        Case Else
            $sAttrib = ' /A'
    EndSwitch
   
    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')
   
    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
       
        While 1
            $sRead = StdoutRead($hDir, False, True)
           
            If @error Then
                ExitLoop
            EndIf
           
            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next
   
    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
   
    If @error Then
        Return SetError(1)
    EndIf
   
    $aOut[0] = UBound($aOut)-1
    Return $aOut
EndFunc


Dim $aReturnB[$aReturn[0]+1][2]
$aReturnB[0][0] = $aReturn[0]

For $i = 1 To $aReturn[0] Step +1
    $aReturnB[$i][1] = FileGetTime($aReturn[$i], 0, 1)
Next

_ArraySort($aReturnB, 1, 1, $aReturnB[0][0], 1)
_ArrayDisplay($aReturnB,"Свежие даты")


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

Re: Поиск файлов на диске
« Ответ #7 Отправлен: Ноябрь 11, 2010, 15:38:10 »

Оффлайн labudator [?]

  • Новичок
  • *
  • Сообщений: 25
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Поиск файлов на диске
« Ответ #8, Отправлен: Декабрь 27, 2017, 15:54:11 »
А как бы оптимизировать этот скрипт чтобы он просто выдавал ВСЕ файлы в указанной директории?

а вообще очень интересный скрип, может кто нибудь объяснить как он работает?

что делает строка
Код: AutoIt [Выделить]
$hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)


и что делает
Код: AutoIt [Выделить]
 $sRead = StdoutRead($hDir, False, True)

« Последнее редактирование: Декабрь 27, 2017, 16:55:09 от labudator »

Оффлайн ra4o [?]

  • Скриптер
  • ****
  • Сообщений: 809
  • Репутация: 144
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Поиск файлов на диске
« Ответ #9, Отправлен: Декабрь 27, 2017, 18:16:32 »
Если включая вложенные файлы - смотрите первый пост этой темы.
Цитировать
что делает строка
Код:
Код: AutoIt [Выделить]
$hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
 


и что делает
Код:
 
Код: AutoIt [Выделить]
$sRead = StdoutRead($hDir, False, True)

Первая строка запускает в консоли команду "DIR" со всякими ключами и указанием пути, вторая читает из потока результат выполнения этой команды.

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

Re: Поиск файлов на диске
« Ответ #9 Отправлен: Декабрь 27, 2017, 18:16:32 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
8 Ответов
12378 Просмотров
Последний ответ Декабрь 03, 2012, 14:23:33
от Andrey_A
7 Ответов
7213 Просмотров
Последний ответ Апрель 16, 2011, 00:12:31
от CreatoR
3 Ответов
2729 Просмотров
Последний ответ Октябрь 31, 2010, 14:10:12
от gregaz
6 Ответов
3835 Просмотров
Последний ответ Февраль 16, 2011, 15:59:43
от e-Mike
0 Ответов
2208 Просмотров
Последний ответ Февраль 12, 2011, 22:02:30
от CreatoR
2 Ответов
3483 Просмотров
Последний ответ Апрель 26, 2011, 10:14:02
от madmasles
15 Ответов
7875 Просмотров
Последний ответ Январь 23, 2012, 00:40:15
от CreatoR
4 Ответов
2265 Просмотров
Последний ответ Октябрь 17, 2014, 18:33:31
от firex
13 Ответов
2477 Просмотров
Последний ответ Апрель 07, 2016, 12:42:44
от InnI
1 Ответов
685 Просмотров
Последний ответ Июнь 23, 2017, 07:28:52
от pvnn