Jump to content

List the files in each subdirectory


j0kky
 Share

Recommended Posts

Probably there are billions of posts about it, but this is my version  :) 

It lists all files of the selected path and the files in its subdirectories. It can be easily converted in a function like _FileListToArray or it can be used to work on those files.

Local $path = InputBox("Path", "Enter the path", @DesktopDir, " M")
If @error Then Exit
Local $count_sub = 0, $k = 0
#forcedef $dir_array ;necessary for tidy.exe

If FileExists($path) Then ;adds or replaces "/" with "\" at the end of the path
    If StringRight($path, 1) <> "\" Then
        If StringRight($path, 1) == "/" Then
            $path = StringTrimRight($path, 1) & "\"
        Else
            $path &= "\"
        EndIf
    EndIf
Else
    MsgBox(0,"Error","The selected folder doesn't exist")
    Exit
EndIf


While 1
    Local $search = FileFindFirstFile($path & "*.*")
    If $search = -1 Then
        If @error == 1 Then ;the folder is empty
            If Not IsDeclared("dir_array") Then
                MsgBox(0, "Info", "The folder is empty")
                Exit
            EndIf
        Else ;other errors, for example an error occurs if there aren't admin rights for some folder
            If IsDeclared("dir_array") Then
                ConsoleWrite($path & " ->>> Some errors occurred with this folder" & @CRLF) ;doesn't work with #requireadmin
            Else
                MsgBox(0, "Error", "No files/directories matched the search pattern" & @CRLF & $path)
                Exit
            EndIf
        EndIf
    EndIf

    While 1
        Local $file = FileFindNextFile($search)
        If @error Then ;files are finished
            FileClose($search)
            If $count_sub <> 0 Then ;if there aren't subdirectories
                If IsDeclared("dir_array") Then ;$dir_array contains every found subdirectory, it has 2 dimensions: the first is the level, the second is the subdirectories list
                    If $count_sub > UBound($dir_array, 2) Then
                        ReDim $dir_array[UBound($dir_array) + 1][$count_sub]
                    Else
                        ReDim $dir_array[UBound($dir_array) + 1][UBound($dir_array, 2)]
                    EndIf
                Else
                    Dim $dir_array[1][$count_sub]
                EndIf
                $count_sub = 0
                Local $search = FileFindFirstFile($path & "*.*")
                While 1 ;saves all found subdirectories in the last level
                    Local $subfolder = FileFindNextFile($search)
                    If @error Then ExitLoop
                    if @extended == 1 Then
                        $dir_array[UBound($dir_array) - 1][$k] = $subfolder
                        $k += 1
                    EndIf
                WEnd
                $k = 0
                FileClose($search)
                $path &= $dir_array[UBound($dir_array) - 1][0] & "\" ;"c:\windows\system32\" --> "C:\windows\system32\drivers\"
                ExitLoop
            Else ;if the directory hasn't subdirectories
                If IsDeclared("dir_array") Then
                    If UBound($dir_array) > 1 Then ;if there is more than one level
                        if UBound($dir_array, 2) > 1 Then
                            If $dir_array[UBound($dir_array) - 1][1] <> "" Then ;if there is more than one subdirectory in the last level
                                For $i = 0 To (UBound($dir_array, 2) - 2) ;deletes the first subdirectory of the last level and replace it with the second subdirectory
                                    $dir_array[UBound($dir_array) - 1][$i] = $dir_array[UBound($dir_array) - 1][$i + 1]
                                Next
                                $dir_array[UBound($dir_array) - 1][UBound($dir_array, 2) - 1] = ""
                                $path = StringRegExpReplace($path, "[^\\]*\\$", "") ;"C:\windows\system32\drivers\" --> "c:\windows\system32\"
                                $path &= $dir_array[UBound($dir_array) - 1][0] & "\"
                                ExitLoop
                            Else
                                $path = StringRegExpReplace($path, "[^\\]*\\[^\\]*\\$", "") ;"C:\windows\system32\drivers\etc\" --> "c:\windows\system32\"
                                While 1
                                    ReDim $dir_array[UBound($dir_array) - 1][UBound($dir_array, 2)] ;deletes the last level
                                    If $dir_array[UBound($dir_array) - 1][1] = "" Then
                                        If UBound($dir_array) == 1 Then
                                            ExitLoop(3)
                                        Else
                                            $path = StringRegExpReplace($path, "[^\\]*\\$", "")
                                            ContinueLoop
                                        EndIf
                                    Else
                                        ExitLoop
                                    EndIf
                                WEnd
                                For $i = 0 To (UBound($dir_array, 2) - 2)
                                    $dir_array[UBound($dir_array) - 1][$i] = $dir_array[UBound($dir_array) - 1][$i + 1]
                                Next
                                $dir_array[UBound($dir_array) - 1][UBound($dir_array, 2) - 1] = ""
                                $path &= $dir_array[UBound($dir_array) - 1][0] & "\"
                                ExitLoop
                            EndIf
                        Else
                            ExitLoop(2)
                        EndIf
                    Else
                        If UBound($dir_array, 2) > 1 Then
                            If $dir_array[0][1] <> "" Then
                                For $i = 0 To (UBound($dir_array, 2) - 2)
                                    $dir_array[0][$i] = $dir_array[0][$i + 1]
                                Next
                                $dir_array[0][UBound($dir_array, 2) - 1] = ""
                                $path = StringRegExpReplace($path, "[^\\]*\\$", "")
                                $path &= $dir_array[0][0] & "\"
                                ExitLoop
                            Else
                                ExitLoop(2)
                            EndIf
                        Else
                            ExitLoop(2)
                        EndIf
                    EndIf
                Else
                    ExitLoop(2)
                EndIf
            EndIf
        EndIf

        if @extended = 1 Then ;it's a folder, not a file
            $count_sub += 1
            ContinueLoop
        EndIf

        #cs ENTER YOUR CODE HERE, FOR EXAMPLE:
        ConsoleWrite("File: " & $path & $file & @CRLF)
        #ce
        
        ConsoleWrite("File: " & $path & $file & @CRLF)

    WEnd
WEnd

:bye:

Edited by j0kky
Link to comment
Share on other sites

There is already a UDF function called _FileListToArrayRec().

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

BTW, the "M2" in the inputbox limits the user from putting more than 2 characters into it.

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...