Code: Select all
Global NewList cfNames.s()
Global NewList cfTypes.s()
;{ Windows Specific Procedure }
Procedure.i CountFiles(Path.s, Ignore_SubDIRs.b = 0, State.b = 1)
Protected _Data.WIN32_FIND_DATA, Path$ = Path + "\*.*", IsTrue.b
Static Files
If State : Files = 0 : EndIf
hF = FindFirstFile_(Path$, @_Data)
If hF <> #INVALID_HANDLE_VALUE
Repeat
If _Data\dwFileAttributes & #FILE_ATTRIBUTE_DIRECTORY
If Ignore_SubDIRs = 1 : Continue : EndIf
;// skip file or directory that has an associated reparse point,
;// or a file that is a symbolic link. Basically to avoid potential
;// infinitely recursive directory tree.
If Not _Data\dwFileAttributes & #FILE_ATTRIBUTE_REPARSE_POINT
;// make sure we skip "." And ".."
;// some file names can start With a dot, so just testing For the
;// first dot is Not suffient.
If PeekS(@_Data\cFileName) <> "." And PeekS(@_Data\cFileName) <> ".."
;// We found a sub-directory, so get the files in it too
Path$ = Path + "\" + PeekS(@_Data\cFileName)
;// recurrsion here!
CountFiles(Path$, 0, 0) ; Traverse Directory
EndIf
EndIf
Else
ForEach cfTypes()
If cfTypes() = GetExtensionPart(PeekS(@_Data\cFileName))
IsTrue = 1
Break
EndIf
Next
If IsTrue = 1 : IsTrue = 0 : Continue : EndIf
ForEach cfNames()
If cfNames() = GetFilePart(PeekS(@_Data\cFileName))
IsTrue = 1
Break
EndIf
Next
If IsTrue = 1 : IsTrue = 0 : Continue : EndIf
Files + 1
EndIf
Until FindNextFile_(hF, @_Data) = 0
FindClose_(hF)
EndIf
ProcedureReturn Files
EndProcedure
;}
Procedure.b AddFiletype(Str$)
If AddElement(cfTypes()) <> 0
cfTypes() = Str$
ProcedureReturn 1
EndIf
EndProcedure
Procedure.b AddFilename(Str$)
If AddElement(cfNames()) <> 0
cfNames() = Str$
ProcedureReturn 1
EndIf
EndProcedure
Procedure.b DelFiletype(Str$)
ForEach cfTypes()
If cfTypes() = Str$
DeleteElement(cfTypes())
ProcedureReturn 1
EndIf
Next
EndProcedure
Procedure.b DelFilename(Str$)
ForEach cfNames()
If cfNames() = Str$
DeleteElement(cfNames())
ProcedureReturn 1
EndIf
Next
EndProcedure
Procedure.b ClearFilenames()
ClearList(cfNames())
EndProcedure
Procedure.b ClearFiletypes()
ClearList(cfTypes())
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Path.s = #PB_Compiler_Home
Debug "CountFiles()"
Debug "Path: " + Path
Debug " "+CountFiles(Path, 1) + " Files. Excluded SubDirectories."
; Debug " "+CountFiles(Path) + " Regular, Include SubDirectories."
AddFiletype("exe")
Debug " "+CountFiles(Path, 1) + " Files. Excluded executables filetypes. Excluded SubDirectories."
DelFiletype("exe")
AddFilename("PureBasic.exe")
Debug " "+CountFiles(Path, 1) + " Files. Excluded file: PureBasic.exe. Excluded SubDirectories."
AddFilename("unins000.exe")
Debug " "+CountFiles(Path, 1) + " Files. Excluded files: PureBasic.exe and unins000.exe. Excluded SubDirectories."
ClearFilenames() : ClearFiletypes()
Debug " "
Debug " "+CountFiles(Path) + " Files. SubDirectories Included."
AddFiletype("exe")
Debug " "+CountFiles(Path) + " Files. Excluded executables filetypes. SubDirectories Included."
AddFilename("PureBasic.chm")
Debug " "+CountFiles(Path) + " Files. Excluded file: PureBasic.chm. Excluded executables filetypes. Included SubDirectories."
CompilerEndIf
Debugging Output:
CountFiles()
Path: D:\Program Files\PureBasic 5.42\
- 4 Files. Excluded SubDirectories.
2 Files. Excluded executables filetypes. Excluded SubDirectories.
3 Files. Excluded file: PureBasic.exe. Excluded SubDirectories.
2 Files. Excluded files: PureBasic.exe and unins000.exe. Excluded SubDirectories.
937 Files. SubDirectories Included.
922 Files. Excluded executables filetypes. SubDirectories Included.
921 Files. Excluded file: PureBasic.chm. Excluded executables filetypes. Included SubDirectories.
Click Here to jump to the later post with enhanced version of CountFiles(), also using PB native commandset.