Что нового

Как максимально быстро найти директорию внутри другой?

Suppir

Продвинутый
Сообщения
967
Репутация
62
Добрый день!

Есть переменная $dir= "12345" и переменная $homedir = "C:\homedir".

Внутри директории C:\homedir очень много вложенных директорий. И где-то глубоко внутри возможно спрятана искомая директория "12345". Необходимо максимально быстро найти полный путь к директории "12345" (если таковая существует).

Давшему код плюсану 5 раз :smile:
 

SyDr

Сидра
Сообщения
651
Репутация
158
Нету максимально быстро. Просто ищешь свой каталог рекурсивно, если находишь - то тут же прекращаешь рекурсивную обработку.

Код:
#include <Array.au3>

Global $bFound = False
Global $sDir = "DS"
_FileFindDir($bFound, $sDir, @WorkingDir, "D:\Music")
MsgBox(4096, Default, $sDir)


Func _FileFindDir(ByRef $bFound, ByRef $sDir, $sParentDir, $sSearchDir = $sParentDir)
    FileChangeDir($sSearchDir) ; Переходим в каталог для поиска
    Local $sHandle = FileFindFirstFile("*") ; Инициализируем поиск
	Local $sNextDir = ""
    While 1
        If $sHandle = -1 Or $bFound Then ; Если каталог пуст изначально или результат найден - закрываем хэндл и прекращаем поиск
            FileClose($sHandle)
            ExitLoop
        EndIf

        $sNextDir = FileFindNextFile($sHandle) ; Иначе заносим путь к найденному элементу

        If @error Then ; Если файлы/каталоги закончились - закрываеи хэндл
            FileClose($sHandle)
			ExitLoop
        Else ; иначе проверяем, каталог ли это
			If StringInStr(FileGetAttrib($sNextDir), "D") Then
				If $sNextDir = $sDir Then
					$bFound = True
					$sDir = @WorkingDir & "\" & $sNextDir
				Else
					_FileFindDir($bFound, $sDir, @WorkingDir, @WorkingDir & "\" & $sNextDir) ; Если найденное - каталог, то продолжаем поиск в нём.
				EndIf
			EndIf
		EndIf
    WEnd
    FileChangeDir($sParentDir) ; Переходим в родительский каталог
    If $sParentDir = $sSearchDir Then $stDir = ""; Если родительский каталог = каталог для поиска (поиск закончен). Каталог не найден
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <File.au3>

$HomeDir = 'C:\Windows'
$Dir = 'Wallpaper'

ConsoleWrite(_FindDir($HomeDir, $Dir) & @CR)

Func _FindDir($sRoot, $sDir)

	If StringInStr(FileGetAttrib($sRoot & '\' & $sDir), 'D') Then
		Return $sRoot & '\' & $sDir
	EndIf

	Local $Result = '', $DirList = _FileListToArray($sRoot, '*', 2)

	If Not @error Then
		For $i = 1 To $DirList[0]
			$Result = _FindDir($sRoot & '\' & $DirList[$i], $sDir)
			If Not @error Then
				ExitLoop
			EndIf
		Next
	EndIf
	Return SetError(($Result = ''), 0, $Result)
EndFunc   ;==>_FindDir
 

amel27

Продвинутый
Сообщения
146
Репутация
55
может не совсем в тему, но рискну:

Код:
#include <array.au3>

_ArrayDisplay(_DirFind("C:\homedir", "12345"))

Func _DirFind($homedir, $dir)
	Local $foo=Run(@ComSpec &' /c dir /b/s "'& $homedir &'\*'& $dir &'"',@SystemDir,@SW_HIDE,2),$buf
	While 1
		$buf &= StdoutRead($foo)
		If @error Then Return StringRegExp($buf,'(?im)^(?>.*\\)\Q'& $dir &'\E(?=[\r\n])',3)
	Wend
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
SyDr
Отлично! Работает за одним "но". Если такой директории нет, то в месседжбоксе показывает имя директории, а нужно, чтобы показывал "директрия $dir не найдена".


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

Yashied
Работает, спасибо!


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

amel27

Вроде бы работает, но неверно отображает русские названия папок (козябрами).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Верх