So this is an article to list methods of retrieving the number of files in a folder/directory.
Why?
Why can't we just use a loop and file pattern native to the Autohotkey programming language:
copyraw
	
This works fine at home on your local host on a local drive.  Try using this over a networked drive and more time will be spent counting the files then the actual processing (or whatever your script is trying to do).UserFolder:="C:" -- UserFolder := RegExReplace( MyInputField, "\\$") ; gets rid of trailing slash if required -- Method #1 count := 0 Loop, %UserFolder%\*.*, 0, 1 count++ -- note for future use: ; if A_LoopFileAttrib contains H,R,S ; continue
- UserFolder:="C:"
 - -- UserFolder := RegExReplace( MyInputField, "\\$") ; gets rid of trailing slash if required
 - -- Method #1
 - count := 0
 - Loop, %UserFolder%\*.*, 0, 1
 - count++
 - -- note for future use:
 - ; if A_LoopFileAttrib contains H,R,S
 - ; continue
 
Method #2: FileSystemObject ComObjCreate
copyraw
	
UserFolder:="C:"
-- to return file count in a folder
ItemCount := ComObjCreate("Shell.Application").NameSpace(UserFolder).Items.Count
FileCount := ComObjCreate("Scripting.FileSystemObject").GetFolder(UserFolder).Files.Count
FolderCount := ItemCount - FileCount
-- quick if looking at one directory.
-- just as slow if looping for subdirectories:
Loop, %UserFolder%\*.*, 1, 1
{
        ThisFolder := RegExReplace( A_LoopFileFullPath, "\\$" )
        ItemCount := ComObjCreate("Shell.Application").NameSpace(ThisFolder).Items.Count
        FileCount := ComObjCreate("Scripting.FileSystemObject").GetFolder(ThisFolder).Files.Count
        FolderCount := ItemCount - FileCount
        TotalFileCount += FileCount
        TotalFolderCount += FolderCount
}
	- UserFolder:="C:"
 - -- to return file count in a folder
 - ItemCount := ComObjCreate("Shell.Application").NameSpace(UserFolder).Items.Count
 - FileCount := ComObjCreate("Scripting.FileSystemObject").GetFolder(UserFolder).Files.Count
 - FolderCount := ItemCount - FileCount
 - -- quick if looking at one directory.
 - -- just as slow if looping for subdirectories:
 - Loop, %UserFolder%\*.*, 1, 1
 - {
 - ThisFolder := RegExReplace( A_LoopFileFullPath, "\\$" )
 - ItemCount := ComObjCreate("Shell.Application").NameSpace(ThisFolder).Items.Count
 - FileCount := ComObjCreate("Scripting.FileSystemObject").GetFolder(ThisFolder).Files.Count
 - FolderCount := ItemCount - FileCount
 - TotalFileCount += FileCount
 - TotalFolderCount += FolderCount
 - }
 
Method #3: Standard Function with Loop
copyraw
	
-- input parameters: 
-- -- Folder=folder/file pattern.  
-- -- Subfolders=1 or 0 (recurse into subfolders or not)
SC_Load(Folder, Subfolders){
        global SC_Size,SC_Ext,SC_FullPath,SC_Name,SC_TotalFiles
        SC_Size         := Object()
        SC_Ext          := Object()
        SC_FullPath     := Object()
        SC_Name         := Object()
        SC_TotalFiles   := 0
        Loop, %Folder%, , %Subfolders%
        {
                SC_Size[A_Index]        := A_LoopFileSize
                SC_Ext[A_Index]         := A_LoopFileExt
                SC_FullPath[A_Index]    := A_LoopFileFullPath
                SC_Name[A_Index]        := A_LoopFileName
                SC_TotalFiles           := A_Index
        }
}
-- put this function at the end of the script.
-- usage:
SC_Load("C:\*.*", 1)
MsgBox, TotalFiles %SC_TotalFiles%
-- yields number of files in a directory recursively.
	- -- input parameters:
 - -- -- Folder=folder/file pattern.
 - -- -- Subfolders=1 or 0 (recurse into subfolders or not)
 - SC_Load(Folder, Subfolders){
 - global SC_Size,SC_Ext,SC_FullPath,SC_Name,SC_TotalFiles
 - SC_Size := Object()
 - SC_Ext := Object()
 - SC_FullPath := Object()
 - SC_Name := Object()
 - SC_TotalFiles := 0
 - Loop, %Folder%, , %Subfolders%
 - {
 - SC_Size[A_Index] := A_LoopFileSize
 - SC_Ext[A_Index] := A_LoopFileExt
 - SC_FullPath[A_Index] := A_LoopFileFullPath
 - SC_Name[A_Index] := A_LoopFileName
 - SC_TotalFiles := A_Index
 - }
 - }
 - -- put this function at the end of the script.
 - -- usage:
 - SC_Load("C:\*.*", 1)
 - MsgBox, TotalFiles %SC_TotalFiles%
 - -- yields number of files in a directory recursively.
 
Method #4: FileSystemObject ComObjCreate
copyraw
	
Method #5: MS-DOS Command Prompt-- usage (see functions below)
TotalFileCount := CountFilesRecursive( "C:\" )
MsgBox, TotalFiles %TotalFileCount%
-- functions to put at bottom of script
CountFilesRecursive(Folder){
        static Counter=0,  fso
        fso := fso?fso:ComObjCreate("Scripting.FileSystemObject")
        Folder := fso.GetFolder(Folder) , Counter += Counter?0:CountFiles(Folder.path)
        For Subfolder in Folder.SubFolders
                Counter += CountFiles(Subfolder.path) , CountFilesRecursive(Subfolder.path)
        return Counter
}
CountFiles(Folder) {
        fso := ComObjCreate("Scripting.FileSystemObject")
        Folder := fso.GetFolder(Folder)
        return fso.GetFolder(Folder).Files.Count
}
	- -- usage (see functions below)
 - TotalFileCount := CountFilesRecursive( "C:\" )
 - MsgBox, TotalFiles %TotalFileCount%
 - -- functions to put at bottom of script
 - CountFilesRecursive(Folder){
 - static Counter=0, fso
 - fso := fso?fso:ComObjCreate("Scripting.FileSystemObject")
 - Folder := fso.GetFolder(Folder) , Counter += Counter?0:CountFiles(Folder.path)
 - For Subfolder in Folder.SubFolders
 - Counter += CountFiles(Subfolder.path) , CountFilesRecursive(Subfolder.path)
 - return Counter
 - }
 - CountFiles(Folder) {
 - fso := ComObjCreate("Scripting.FileSystemObject")
 - Folder := fso.GetFolder(Folder)
 - return fso.GetFolder(Folder).Files.Count
 - }
 
copyraw
	
dir c:\*.* /os /s -- bear with me as i try to create a for loop one to omit all the header info
- dir c:\*.* /os /s
 - -- bear with me as i try to create a for loop one to omit all the header info
 
Category: AutoHotkey :: Article: 512
	

						  
                
						  
                
						  
                
						  
                
						  
                

Comments
UserFolder := "C:\Windows\System32"
Start := A_TickCount
Loop, %UserFolder%\*.*, 0, 1
Count := A_Index
Finish := A_TickCount - Start
MsgBox %Count% files counted in %Finish% milliseconds
ExitApp