searchdirectoryfindnsisfindfirst

NSIS Find all .txt files


I currently have a check to find all text files in $INSTDIR, shown below.

However, there could potentially be subdirectories, such as $INSTDIR\mySub, which contains additional .txt files. Is there a way to keep a similar loop structure but search all subdirectories as well?

FindFirst $R0 $R1 "$INSTDIR\*.txt"
IfErrors ExitInstaller 0
LoopIt:
  Messagebox MB_OK "Do some processing on $R1"
  FindNext $R0 $R1
  IfErrors 0 LoopIt

Solution

  • Function ProcessTextFiles
    Exch $0
    Push $1
    Push $2
    FindFirst $1 $2 "$0\*.txt"
    loop:
        IfErrors end
        DetailPrint 'Found "$0\$2"'
        FindNext $1 $2
        goto loop
    end:
    FindClose $1
    FindFirst $1 $2 "$0\*.*"
    dirloop:
        IfErrors dirend 
        IfFileExists "$0\$2\*.*" 0 dirnext
        StrCmp $2 "." dirnext
        StrCmp $2 ".." dirnext
        Push "$0\$2"
        call ${__FUNCTION__}
    dirnext:
        FindNext $1 $2
        goto dirloop
    dirend:
    FindClose $1
    Pop $2
    Pop $1
    Pop $0
    FunctionEnd
    
    section
    push "$InstDir"
    call ProcessTextFiles
    sectionend