News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

How to get total number of files on a partition

Started by fearless, October 31, 2007, 09:43:58 AM

Previous topic - Next topic

fearless

Hi All,

I've been coding an application that utilizes FindFirst / FindNext calls to recursively traverse the entire c: drive - lots of useful information relating to it was found on these forums. Cheers for that. :D  :U

My question is:

Is there a way of determining the total number of files on a disk/partition by utilizing some low level access, like using the DeviceIO function to read this information from somewhere?. I've spent a good amount of time on google, looking for "Win32 total file count", "total files on disk", "total files on drive" "code number of files on partition" etc etc - lots of variations. The only code/examples I've found relate to doing a recursive walk of the files/folders to total up that information. Surely there is a way to determine beforehand this information? I've briefly looked at NTFS and FAT structures to see if the information can be calculated from these. I just cant seem to find anything at the moment. Hopefully someone can point me in the right direction.

I want to use the total files count to present a progress bar. My program will be using other disks later - its only traversing the c: drive at the moment, but it would be handy to correctly show the progress of the recursive walk. Currently i have had to settle with the Marquee effect of the progress bar to indicate that something is happening, but obviously this does not indicate how long left to wait.
ƒearless

MichaelW

At least for Windows 2000, and with my configuration, it looks to me like Windows is doing a recursive search to count the files and directories, because for a directory of moderate size the counts start small and gradually increase to their final values.
eschew obfuscation

sinsi

For the progress thing, use GetDiskFreeSpaceEx to find the total used bytes, then as you recurse keep a running total of file bytes.
Light travels faster than sound, that's why some people seem bright until you hear them.

fearless

Cheers for that sinsi

The WIN32_FIND_DATA structure returns the file size and i can add this to my count. And i can use GetDiskFreeSpaceEx on each disk and total up for the whole systems combined maximum for the progress bar. Nice! :D

I was thinking i might have had to create another thread that looked/scanned ahead and updated the total file count as i went. Obviously i would be putting more workload on the CPU by doing so and slowing down the entire process, this way i can get the info at the start of the program and then still do the recursive scan and update the progress bar each time i count a file.

I presume ill need a QWORD to store the maximum of all free space, or will i need a bigger defined variable? Also with the nFileSizeHigh and nFileSizeLow fields of WIN32_FIND_DATA structure, how do i add these properly together to my QWORD variable. I have a feeling that it isnt as simple as:

add myqword, nFileSizeHigh
add myqword, nFileSizeLow

ƒearless

sinsi

Try something like

user_free     dd 0,0
total_bytes   dd 0,0
total_free    dd 0,0
running_total dd 0,0

drive_string  db 'c:\',0

    ...
    invoke GetDiskFreeSpace,offset drive_string,offset user_free,offset total_bytes,offset total_free
    ...
    mov eax,wfd.nFilesizeLow
    mov edx,wfd.nFilesizeHigh
    add running_total,eax
    adc running_total+4,edx
    ...


Something to beware of - Computing the size of a directory is more than just adding file sizes
Light travels faster than sound, that's why some people seem bright until you hear them.