Что нового

Поиск файлов на диске

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Функция ищет файл(ы) по маске в указанной корневой директории и всех ее субдиректориях и выводит информацию в консоль. Ну прям как поиск в Windows. Используется рекурсия.


Код:
#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
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Метод побыстрее, плюс возможность указать более одного фильтра (маска), и поддержка опций как в функций «_FileListToArray»:

Код:
#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
 

alexnasa

Новичок
Сообщения
50
Репутация
0
Помогите новичку!
Нужно (неспешно) написать код для слежения за своевременным-регулярным пополнением жёсткого диска свежими файлами-архивами (удаленный ПК, сеть без домена). Должно работать либо автоматич. режимом (напр. посылать аларм об отсутствии вот уже целый час свежих файлов в такой-то папке ), либо хотя бы просто создавать-показывать отчет о самых свежих файлах (оператор сам сравнит со своими часами -не староват ли час у самых свежих файлов и будет следить за их молодостью в отчетах любой формы)
Задача для меня не слишком "горит" потому, что в самой важной из программ, за которыми нужно следить(оч редко, но подвисает), я отыскал внутри интерфейса настроек окошко-перечень-отчет списком с датами (до минут!) и написал "открывать это окно и делать скрииншот", кот. далее оценит оператор.
Но надо бы придумать и для остальных случаев универсальную систему слежения.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
alexnasa
1. твой вопрос практически не связан с данной темой. т.к. нужно допиливать много чего.
2. если у тебя есть наработки, то не стесняйся выкладывать, тебе помогут их довести до ума. но тогда твой пост придется перенести в отдельную тему в разделе для новичков
3. если у тебя нет наработок, и ты хочешь чтобы тебе сделали этот скрипт, то твой пост надлежит перенести в раздел "Стол заказов" с соответствующим правилам оформлением.
как видишь, так или иначе нужная новая тема. предлагаю тебе самому создать эту тему в нужном тебе разделе.
 

alexnasa

Новичок
Сообщения
50
Репутация
0
Гмм.. Название темы "поиск файлов на диске". Даны примеры поиска по маске расширения. А мне надо найти файл по признаку "самый молодой". Уважаемый dwerf в одном из ответов (Re: сортировка массива или FileListToArray упорядоченный по дате изменения) приводил код, который мне почти что подходит. но его нужно немного поправить. Задача моя не уникальная. Многим может понадобиться такая полезняшка на случай, если программа "залипла" и перестала писать на диск. Не проверять же, вручную листая архивы, каждый час(год).
 

kaster

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

alexnasa

Новичок
Сообщения
50
Репутация
0
Мне просто нравится работа кода №2 в этом посте. Под свою задачу я добавил в него _ArraySort. И теперь он в окне мне показывает список из 28-ми самых свежих файловых дат. Осталость только отбить это окно в файл-скрииншот и оставить его лежать на шареном ресурсе в качестве документа-фотоотчета для ревизора-оператора (мол 28 самых свежих файлов мы имеем вот за эту дату-время).

Код:
#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,"Свежие даты")
 

labudator

Новичок
Сообщения
25
Репутация
0
А как бы оптимизировать этот скрипт чтобы он просто выдавал ВСЕ файлы в указанной директории?

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

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


и что делает
Код:
$sRead = StdoutRead($hDir, False, True)
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Если включая вложенные файлы - смотрите первый пост этой темы.
что делает строка
Код:
Код:
$hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)


и что делает
Код:
Код:
$sRead = StdoutRead($hDir, False, True)
Первая строка запускает в консоли команду "DIR" со всякими ключами и указанием пути, вторая читает из потока результат выполнения этой команды.
 
Верх