Below is a simple program to list files in a directory recursively and sort them by their sizes. I am using this tool in my work for some time as I want to detect huge files in some directories to free up disk spaces by deleting them. Hopefully it will be useful for you as well and hence I am posting it here :) I am using boost filesystem library to do the real work.
#include <iostream>
#include <iterator>
#include <queue>
#include <vector>
#include <map>
#include <algorithm>
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;
int main(int argc, char *argv[])
{
queue<path> directories;
multimap<uintmax_t, path> filesizes;
if (argc < 2) {
cout << "Usage: " << argv[1] << " path\n";
return 1;
}
path p(argv[1]);
try {
if (exists(p)){
if (is_regular_file(p)){
cout << file_size(p) << " " << p << endl;
return 0;
}
if (!is_directory(p)) {
return 0;
}
directories.push(p);
vector <path> entries;
path thispath;
while (!directories.empty()) {
thispath = directories.front();
directories.pop();
copy(directory_iterator(thispath), directory_iterator(), back_inserter(entries));
for (vector <path>::iterator it = entries.begin();
it != entries.end(); ++it) {
if (!exists(*it))
continue;
if (!is_symlink(*it) && is_directory(*it)) {
directories.push(*it);
} else if (is_regular(*it)) {
uintmax_t file_siz = file_size(*it);
filesizes.insert(pair<uintmax_t, path>(file_siz, *it));
}
}
entries.clear();
}
}
for (multimap<uintmax_t, path>::iterator it1 = filesizes.begin(), it2 = filesizes.end();
it1 != it2; ++it1) {
cout << it1->first << " " << it1->second << endl;
}
filesizes.clear();
} catch(const filesystem_error & ex) {
cout << ex.what() << '\n';
}
return 0;
}
No comments:
Post a Comment