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