What?
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:
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

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).

Method #2: FileSystemObject ComObjCreate
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
-- 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
-- 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
}
Method #5: MS-DOS Command Prompt
dir c:\*.* /os /s

-- bear with me as i try to create a for loop one to omit all the header info