space used

This commit is contained in:
Ben Harris 2016-10-25 16:08:21 -04:00
parent b8b5675ddb
commit fd33a1383a
2 changed files with 158 additions and 158 deletions

View File

@ -1,76 +1,76 @@
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unordered_map>
using namespace std;
class Hashtable {
unordered_map<ino_t, bool> htmap;
public:
void put(ino_t key, bool value) { htmap[key] = value; }
bool get(ino_t key) { return htmap[key]; }
};
int file_cnt = 0, link_cnt = 0, dir_cnt = 0;
unsigned long space_used = 0;
struct stat buf;
Hashtable ht;
void listdir (const char *name) {
DIR *dir;
struct dirent *entry;
if (!(dir = opendir(name))) return;
if (!(entry = readdir(dir))) return;
do {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue;
if (entry->d_type == DT_DIR) {
// if (ht.get(&entry->d_ino)) continue;
// ht.put(&entry->d_ino, true);
dir_cnt++;
char path[4096];
int len = snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name);
path[len] = 0;
printf("[d] %s/%s\n", name, entry->d_name);
listdir(path);
}
else {
if (ht.get(entry->d_ino)) continue;
if (entry->d_type == DT_LNK) {
link_cnt++;
printf("[l] %s/%s\n", name, entry->d_name);
char path[4096];
int len = snprintf(path, sizeof(path) - 1, "%s/%s", name, entry->d_name);
path[len] = 0;
stat(path, &buf);
space_used += buf.st_blocks * 512;
}
else{
file_cnt++;
printf("[f] %d %s/%s\n", (int)entry->d_ino, name, entry->d_name);
char path[4096];
int len = snprintf(path, sizeof(path) - 1, "%s/%s", name, entry->d_name);
path[len] = 0;
stat(path, &buf);
space_used += buf.st_blocks * 512;
}
ht.put(entry->d_ino, true);
}
} while ((entry = readdir(dir)));
closedir(dir);
}
int main (int argc, char** argv) {
listdir(argv[1]);
printf("\ntotals\nfile count: %d\tdir count: %d\tlink count: %d\nspace used: %lu\n", file_cnt, dir_cnt, link_cnt, space_used);
return 0;
}
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unordered_map>
using namespace std;
// class Hashtable {
// unordered_map<ino_t, bool> htmap;
// public:
// void put(ino_t key, bool value) { htmap[key] = value; }
// bool get(ino_t key) { return htmap[key]; }
// };
int file_cnt = 0, link_cnt = 0, dir_cnt = 0;
unsigned long space_used = 0;
struct stat buf;
// Hashtable ht;
unordered_map<ino_t, bool> ht;
void listdir (const char *name) {
DIR *dir;
struct dirent *entry;
if (!(dir = opendir(name))) return;
if (!(entry = readdir(dir))) return;
do {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue;
if (entry->d_type == DT_DIR) {
// if (ht.get(&entry->d_ino)) continue;
// ht.put(&entry->d_ino, true);
dir_cnt++;
char path[4096];
int len = snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name);
path[len] = 0;
printf("[d] %s/%s\n", name, entry->d_name);
listdir(path);
}
else {
if (ht[entry->d_ino]) continue;
if (entry->d_type == DT_LNK) {
link_cnt++;
printf("[l] %s/%s\n", name, entry->d_name);
char path[4096];
int len = snprintf(path, sizeof(path) - 1, "%s/%s", name, entry->d_name);
path[len] = 0;
stat(path, &buf);
space_used += buf.st_blocks;
}
else{
file_cnt++;
printf("[f] %d %s/%s\n", (int)entry->d_ino, name, entry->d_name);
char path[4096];
int len = snprintf(path, sizeof(path) - 1, "%s/%s", name, entry->d_name);
path[len] = 0;
stat(path, &buf);
space_used += buf.st_blocks;
}
ht[entry->d_ino] = true;
}
} while ((entry = readdir(dir)));
closedir(dir);
}
int main (int argc, char** argv) {
listdir(argv[1]);
printf("\ntotals\nfile count: %d\tdir count: %d\tlink count: %d\nspace used: %lu blocks\n\t%lu bytes\n", file_cnt, dir_cnt, link_cnt, space_used, space_used*512);
return 0;
}

View File

@ -1,82 +1,82 @@
#include <dirent.h>
#include <string>
#include <sys/stat.h>
#include <unordered_map>
#include <iostream>
using namespace std;
class Hashtable {
unordered_map<ino_t, bool> ht;
public:
void put(ino_t key, bool value) { ht[key] = value; }
bool get(ino_t key) { return ht[key]; }
};
int dircnt = 0, filecnt = 0, lnkcnt = 0;
unsigned long space_used;
struct stat buf;
Hashtable ht;
bool listFileAndType(const string &dir) {
DIR *dirp = opendir(dir.c_str());
if (dirp) {
struct dirent *dp = 0;
while ((dp = readdir(dirp)) != 0 ) {
string file( dp->d_name );
if (file == "." || file == "..") continue;
if (dp->d_type == DT_DIR) {
string dirPath = dir + "/" + file;
cout << "[d] " << dirPath << endl;
dircnt++;
// recurse into directory
listFileAndType( dirPath );
}
else {
if (ht.get(dp->d_ino)) continue;
switch(dp->d_type) {
case DT_REG:
filecnt++;
cout << "[f] ";
break;
case DT_LNK:
lnkcnt++;
cout << "[l] ";
break;
default:
cout << "[none] ";
break;
}
string statpath = dir + "/" + file;
ht.put(dp->d_ino, true);
stat(statpath.c_str(), &buf);
space_used += buf.st_blocks * 512;
cout << statpath << endl;
}
}
closedir( dirp );
return true;
}
else {
return false;
}
}
int main( int argc, char **argv ) {
const string dir = (argc > 1 ? argv[1] : "foo");
if (!listFileAndType(dir)) {
cout << "Error: Cannot open directory '" << dir << "'" << endl;
}
cout << endl << "totals" << endl;
cout << "file count: " << filecnt << "\tdir cnt: " << dircnt << "\tlink cnt: " << lnkcnt << endl;
cout << "space used: " << space_used << endl;
return 0;
}
#include <dirent.h>
#include <string>
#include <sys/stat.h>
#include <unordered_map>
#include <iostream>
using namespace std;
// class Hashtable {
// unordered_map<ino_t, bool> ht;
// public:
// void put(ino_t key, bool value) { ht[key] = value; }
// bool get(ino_t key) { return ht[key]; }
// };
int dircnt = 0, filecnt = 0, lnkcnt = 0;
unsigned long space_used;
struct stat buf;
unordered_map<ino_t, bool> ht;
bool listFileAndType(const string &dir) {
DIR *dirp = opendir(dir.c_str());
if (dirp) {
struct dirent *dp = 0;
while ((dp = readdir(dirp)) != 0 ) {
string file( dp->d_name );
if (file == "." || file == "..") continue;
if (dp->d_type == DT_DIR) {
string dirPath = dir + "/" + file;
cout << "[d] " << dirPath << endl;
dircnt++;
// recurse into directory
listFileAndType( dirPath );
}
else {
if (ht[dp->d_ino]) continue;
switch(dp->d_type) {
case DT_REG:
filecnt++;
cout << "[f] ";
break;
case DT_LNK:
lnkcnt++;
cout << "[l] ";
break;
default:
cout << "[none] ";
break;
}
string statpath = dir + "/" + file;
ht[dp->d_ino] = true;
stat(statpath.c_str(), &buf);
space_used += buf.st_blocks * 512;
cout << statpath << endl;
}
}
closedir( dirp );
return true;
}
else {
return false;
}
}
int main( int argc, char **argv ) {
const string dir = (argc > 1 ? argv[1] : "foo");
if (!listFileAndType(dir)) {
cout << "Error: Cannot open directory '" << dir << "'" << endl;
}
cout << endl << "totals" << endl;
cout << "file count: " << filecnt << "\tdir cnt: " << dircnt << "\tlink cnt: " << lnkcnt << endl;
cout << "space used: " << space_used << endl;
return 0;
}