How to sort all the file names by their size in C++

In this tutorial, we will learn to sort all the file names by their size in C++. We will print the name and size of the files according to the required manner.

For this, we need <windows.h>, which is a header file in C++ which contains the declaration and all the windows API functions and provides lots of functions and attributes to deal with the file system.

We will use a vector of pairs to store the name and size of the file.

We will also use a sort() function to sort the files in the vector.

We will also use a comparator function to sort the file.

The sort function in C++ takes a third argument which just tells, how to sort the elements or on which criteria to sort the elements and that third argument is called a comparator function.
Formally, A comparator function is a function that takes two arguments x and y and returns the value indicating the relative order in which x and y should be sorted.

See: pairs in C++ 

Also See: vectors in C++

Comparator Function Code:

// Comparator function is made to sort the
// in increasing order
bool comparator(pair<string, int> file1, pair<string, int> file2) {
    return file1.second < file2.second;
}

Working of sortFiles() function:

  1. We will use a sortFiles() function which will take path of the folder as an argument.
  2. Declare a vector of pair which will hold the file name and its size.
  3. Iterate through each and every file in the folder using a while loop until we reached the last file.
  4. While iterating the folder, push back the file name and file size into the vector.
  5. At last, return the vector of pair.
vector<pair<string, int>> sortFiles(string path) {
    // make the vector of pair to hold the name and size of the file
    vector<pair<string, int>> file_data;
    string fname  =  path  + "\\*.*";
    WIN32_FIND_DATA data;
    HANDLE h =  FindFirstFile(fname.c_str(),  &data);
    bool present = FindNextFile(h, &data); // check if any file present in the folder or not
    // This while loop will only check for all the files in the folder
    while (FindNextFile(h, &data)) {
        __int64 total_size; // store the size of the file
        string file_name = ""; // store the name of the file
        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;
        total_size = sz.QuadPart;
        file_name = data.cFileName;
        file_data.push_back({file_name, total_size}); // push the file data into the vector
    }
    return file_data;
}

Working of main() function:

  1. We will use the sort() method to sort the vector according to the size of the file.
  2. We have to make a comparator function that will sort the vector by only considering the size of the files.
  3. At last, we have to print the files with their names and sizes in ascending order.

Full code is given below:

#include<bits/stdc++.h>
#include<windows.h>
// #define int long long
using namespace std;

// Comparator function is made to sort the
// in incresing order
bool comparator(pair<string, int> file1, pair<string, int> file2) {
    return file1.second < file2.second;
}


vector<pair<string, int>> sortFiles(string path) {
    // make the vector of pair to hold the name and size of the file
    vector<pair<string, int>> file_data;
    string fname  =  path  + "\\*.*";
    WIN32_FIND_DATA data;
    HANDLE h =  FindFirstFile(fname.c_str(),  &data);
    bool present = FindNextFile(h, &data); // check if the any file present in the folder or not
    // This while loop will check for all the files in the folder
    while (FindNextFile(h, &data)) {
        __int64 total_size; // store the size of the file
        string file_name = ""; // store the name of the file
        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;
        total_size = sz.QuadPart;
        file_name = data.cFileName;
        file_data.push_back({file_name, total_size});
    }
    return file_data;
}

int main()
{
    vector<pair<string, int>> files;
    string path = "C:\\Users\\91821\\Desktop\\important docs"; // enter the path here
    files = sortFiles(path);
    // Now sort files using comparator function
    // comparator function will sort the values according to size of the file.
    sort(files.begin(), files.end(), comparator);
    // print the files name with their sizes in ascending order.
    for (int i = 0; i < files.size(); i++) {
        cout << files[i].first << "            " << (float)files[i].second/1024 <<"KB" << endl;
    }
    return 0;

}

OUTPUT:

Payment Successful.pdf                     68.9092KB
HimanshuResume.pdf                     90.4268KB 
syllabus.pdf                       1171.1KB

Also Read: Find the largest file in a folder in C++

Leave a Reply

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