Åmbrosius 0 Posted October 16, 2010 Okay, bowing again to the superior intellect of all you folks. I'm trying to build a list of all file in a directory according to various criteria. One of which needs to search only the root and the FIRST level only (So in C:\1\2\3 it would search only 1 & 2, and skip 3) I've tried a couple of different ways which don't tend to work at all, and was hoping to use _FileListToArray3 as I'm using it elsewhere, but it doesn't look like it's possible to limit the recursion. Any other UDF that may work? Is it possible? If not, I figured I'd try excluding files from the 'ignored' depths afterwards, but can't figure out how to do that either, since I don't know what those folders are called. Skipped posting code, because none of it works, and generally just calls UDF. Thanks in advance for any nudges/shoves in the right direction. Share this post Link to post Share on other sites
Varian 8 Posted October 16, 2010 This would list all folders and files in a given directory ($Directory) and 1 Level deep of said directoryexpandcollapse popup#include<Array.au3> $Directory = 'C:' $MainArray = _FileListToArray_Recursive($Directory, '*', 0, 2) _ArrayDisplay($MainArray, 'Root of ' & $Directory & ' Only') For $a = 1 To $MainArray[0] If _IsDir($MainArray[$a]) = 'Directory' Then Local $SubArray = _FileListToArray_Recursive($MainArray[$a], '*', 0, 2) If @error Then ContinueLoop For $b = 1 To $SubArray[0] _ArrayAdd($MainArray, $SubArray[$b]) Next EndIf Next $MainArray[0] = UBound($MainArray) - 1 _ArraySort($MainArray) _ArrayDisplay($MainArray, '1 Level Deep of ' & $Directory) Func _IsDir($Dir = '') ;Returns Directory, File, or Bad If StringRight($Dir, 1) = '\' Then $Dir = StringTrimRight($Dir, 1) If Not FileExists($Dir) Then Return 'Bad' If StringInStr(FileGetAttrib($Dir), 'D') <> 0 Then Return 'Directory' Return 'File' EndFunc ;==>_IsDir ;=============================================================================== ; $aRetItemType: 0 = Files and folders, 1 = Files only, 2 = Folders only ; $aRetPathType: 0 = Filename only, 1 = Path relative to $sPath, 2 = Full path/filename Func _FileListToArray_Recursive($sPath, $sFilter = "*", $aRetItemType = 0, $aRetPathType = 0, $bRecursive = False) Local $sRet = "", $sRetPath = "" $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") If Not FileExists($sPath) Then Return SetError(1, 1, "") If StringRegExp($sFilter, "[\\/ :> <\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "") $sPath &= "\|" $sOrigPathLen = StringLen($sPath) - 1 While $sPath $sCurrPathLen = StringInStr($sPath, "|") - 1 $sCurrPath = StringLeft($sPath, $sCurrPathLen) $Search = FileFindFirstFile($sCurrPath & $sFilter) If @error Then $sPath = StringTrimLeft($sPath, $sCurrPathLen + 1) ContinueLoop EndIf Switch $aRetPathType Case 1 ; relative path $sRetPath = StringTrimLeft($sCurrPath, $sOrigPathLen) Case 2 ; full path $sRetPath = $sCurrPath EndSwitch While 1 $File = FileFindNextFile($Search) If @error Then ExitLoop If ($aRetItemType + @extended = 2) Then ContinueLoop $sRet &= $sRetPath & $File & "|" WEnd FileClose($Search) If $bRecursive Then $hSearch = FileFindFirstFile($sCurrPath & "*") While 1 $File = FileFindNextFile($hSearch) If @error Then ExitLoop If @extended Then $sPath &= $sCurrPath & $File & "\|" WEnd FileClose($hSearch) EndIf $sPath = StringTrimLeft($sPath, $sCurrPathLen + 1) WEnd If Not $sRet Then Return SetError(4, 4, "") Return StringSplit(StringTrimRight($sRet, 1), "|") EndFunc ;==>_FileListToArray_Recursive Share this post Link to post Share on other sites
Åmbrosius 0 Posted October 16, 2010 This would list all folders and files in a given directory ($Directory) and 1 Level deep of said directoryYou're a lifesaver, thanks a mil Share this post Link to post Share on other sites