DeathZ
DeathZ

Reputation: 31

Check all files sizes in a path (C++)

I'm trying to loop so that my program can get the weight of all files in a folder, and if the weight of any of these is equal to X, it will do an action, I need to know how I can loop like this, and i have a func to know whats the file size

std::ifstream::pos_type filesize(const char* filename)
{
    std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
    return in.tellg();
}

Upvotes: 1

Views: 232

Answers (1)

sweenish
sweenish

Reputation: 5202

Here's a short example program that demonstrates how to use C++17's <filesystem> library to iterate over a directory. If your compiler is fairly up-to-date, it should support C++17 without issue.

#include <filesystem>
#include <iostream>

int main() {
  namespace fs = std::filesystem;

  fs::path pwd("");  // Current directory program was executed from
  pwd = fs::absolute(pwd);

  for (auto& i : fs::directory_iterator(pwd)) {
    try {
      if (fs::file_size(i.path()) / 1024 > 2048) {
        std::cout << i.path() << " is larger than 2MB\n";
      }
    } catch (fs::filesystem_error& e) {
      std::cerr << e.what() << '\n';
    }
  }
}

This was the contents of the directory:

.
├── a.out
├── fiveKB
├── fourMB
├── main.cpp
└── oneMB

0 directories, 5 files

And information about the files:

drwxr-xr-x   7 user  staff   224B Jul 29 22:11 ./
drwxr-xr-x  13 user  staff   416B Jul 29 21:59 ../
-rwxr-xr-x   1 user  staff    47K Jul 29 22:10 a.out*
-rw-r--r--   1 user  staff   5.0K Jul 29 21:58 fiveKB
-rw-r--r--   1 user  staff   4.0M Jul 29 21:59 fourMB
-rw-r--r--   1 user  staff   450B Jul 29 22:11 main.cpp
-rw-r--r--   1 user  staff   1.0M Jul 29 21:59 oneMB

And finally, the output:
"/Users/user/Documents/tmp/test/fourMB" is larger than 2MB

Upvotes: 2

Related Questions