How to find the largest file in a folder in C++

In this tutorial, we will learn how to find the largest file in a folder using C++. The simplest approach for this purpose is to use a header file named as <windows.h>.

<windows.h>: It is a header file defined in C and C++ programming languages. It contains the declaration of all the windows APIs functions and also it provides lots of built-in functions to deal with windows files and folders.

We will also use a pair container to store the destination and size of the largest file.

Check for reference: pair in C++

Approach:

  1. We will use the searchLargestFile() function to calculate the largest file in the folder.
  2. We will travel recursively because if there is any other folder inside that folder then we will also travel into that folder.
  3. We will calculate the size of each and every file by using a while loop and continue until we reached at every file.
  4. Declare the pair container which will hold two values: first is the destination of file and second is the size of the file and also set the return type of the function to pair<string, __int64>.
  5. At last, return the pair, extract the data from pair and print the data.

Working of searchLargestFile() function:

  1. Declare a pair container named largest_file to hold the maximum size of file and file name (Eg.pair<string, int> variable_name).
  2. Find the first file name in the directory using FindFirstFile function.
  3. Start traversing each and every file in that directory until we reached the last file.
  4. Use cFileName attribute for the name of the file and QuadPart for the size of the file.
  5. At last, return the largest_file variable containing the required result.

Implementation of SearchLargestFile function in C++ programming:

pair<string, __int64> searchLargestFile(string path)  {
    WIN32_FIND_DATA data;
    string fname  =  path  + "\\*.*"; // for storing file name
    pair < string,  __int64 >  largest_file;
    HANDLE h =  FindFirstFile(fname.c_str(),  &data);//This function will return the first file of the folder.
    while (FindNextFile(h, &data)) {
        if ( (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { // checking it is folder or file
            // Now skip those file whose name starts with "." and also check for ".."
            if ( strcmp(data.cFileName, ".") != 0 && strcmp(data.cFileName, "..") != 0) 
            // check for subdirectory
            {

                fname = path + "\\" + data.cFileName;
                //Declare a temporary result
                pair<string, __int64> temp_result;
                // recursion: Check the largest file in that subdirectory
                temp_result = searchLargestFile(fname);
                if (temp_result.second > largest_file.second)
                    largest_file = temp_result;
            }
        }
        else {
            LARGE_INTEGER sz;
            // what we get here is the file size. 
            // file sizes can be larger than 2 gigs therefore the size is written as two objects of DWORD type.       
            // they combine to make 64 bit integer values.
            sz.LowPart = data.nFileSizeLow;
            sz.HighPart  = data.nFileSizeHigh;
            if ((__int64)sz.QuadPart > largest_file.second) {
                fname = path + "\\" + data.cFileName; //cFileName provides the name of th file which is under processing.
                largest_file.first = fname;
                largest_file.second = sz.QuadPart;
            }
        }
    }
    return largest_file;
}

The different functions and attributes used in the above code are:

FindFirstFile: This function finds the first file in the folder.
FindNextFile: It finds the next file in the folder.
cFileName: It just returns the name of the file under processing.

See full code below:

#include<iostream>
#include<windows.h>
#include<string>

using namespace std;

pair<string, __int64> searchLargestFile(string path)  {
    WIN32_FIND_DATA data;
    string fname  =  path  + "\\*.*"; // for storing file path
    pair < string,  __int64 >  largest_file;
    HANDLE h =  FindFirstFile(fname.c_str(),  &data);   //This function will return the first file of the folder.
    while (FindNextFile(h, &data)) {
        if ( (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { // checking it is folder or file
            // Now skip those file whose name starts with "." and also check for ".."
            if ( strcmp(data.cFileName, ".") != 0 && strcmp(data.cFileName, "..") != 0) // check for subdirectory
            {
                fname = path + "\\" + data.cFileName;
                //Declare a temporary result
                pair<string, __int64> temp_result;
                // recursion: Check the largest file in that subdirectory
                temp_result = searchLargestFile(fname);
                if (temp_result.second > largest_file.second)
                    largest_file = temp_result;
            }
        }
        else {
            LARGE_INTEGER sz;
            // what we get here is the file size. 
            // file sizes can be larger than 2 gigs therefore the size is written as two objects of DWORD type.       
            // they combine to make 64 bit integer values.
            sz.LowPart = data.nFileSizeLow;
            sz.HighPart  = data.nFileSizeHigh;
            if ((__int64)sz.QuadPart > largest_file.second) {
                fname = path + "\\" + data.cFileName;//cFileName provides the name of th file which is under processing.
                largest_file.first = fname;
                largest_file.second = sz.QuadPart;
            }
        }
    }
    return largest_file;

}
int main(int argc, char* argv[])
{
    __int64 size = 0;
    pair < string, __int64 > result = searchLargestFile("C:\\Users\\91821\\Desktop\\important docs");
    // size is in megabytes
    cout << "File is: " << result.first << " FileSize: " << (float)result.second / (1024 * 1024)  << "MB" << endl; // give folder path here
    return 0;
}

Output:

File is: C:\Users\91821\Desktop\important docs\d\syllabus.pdf FileSize: 1.14365MB

 

One response to “How to find the largest file in a folder in C++”

  1. Prashant singh says:

    I found it a very helpful, very concise explanation. love it.

Leave a Reply

Your email address will not be published. Required fields are marked *