diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f4bdfc2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +dc +dc2 +dc.o +dc2.o diff --git a/README.md b/README.md index 765b546..bccae29 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ -# Dircount assignment -## CS426 - -1 - prints every full pathname - -1 - prints a [f] or a [d] next to the path depending on type - -1 - counts the total number of files - -1 - counts the total number of directories - -1 - Never count the same file twice, even if there are links. - -1 - does not go into an infinite loop even if the diretcory structure has loops - -1 - prints the total on disk space used. (NOT the sum of all the file sizes) - --1 - Each day after Wed Oct 26th. - +# Dircount assignment +## CS426 + +1 - prints every full pathname + +1 - prints a [f] or a [d] next to the path depending on type + +1 - counts the total number of files + +1 - counts the total number of directories + +1 - Never count the same file twice, even if there are links. + +1 - does not go into an infinite loop even if the diretcory structure has loops + +1 - prints the total on disk space used. (NOT the sum of all the file sizes) + +-1 - Each day after Wed Oct 26th. + diff --git a/dc b/dc deleted file mode 100755 index b17c5ab..0000000 Binary files a/dc and /dev/null differ diff --git a/dc.o b/dc.o deleted file mode 100644 index cc65eea..0000000 Binary files a/dc.o and /dev/null differ diff --git a/dc2 b/dc2 deleted file mode 100755 index f1e000d..0000000 Binary files a/dc2 and /dev/null differ diff --git a/dc2.o b/dc2.o deleted file mode 100644 index 472b5f8..0000000 Binary files a/dc2.o and /dev/null differ diff --git a/dircount.cc b/dircount.cc index 081a1e7..af21731 100755 --- a/dircount.cc +++ b/dircount.cc @@ -1,76 +1,76 @@ -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -class Hashtable { - unordered_map 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 +#include +#include +#include +#include +#include +#include +using namespace std; + +class Hashtable { + unordered_map 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; +} diff --git a/dircount_v2.cc b/dircount_v2.cc index 81e7a84..2c38fa2 100755 --- a/dircount_v2.cc +++ b/dircount_v2.cc @@ -1,82 +1,82 @@ -#include -#include -#include -#include -#include -using namespace std; - -class Hashtable { - unordered_map 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 +#include +#include +#include +#include +using namespace std; + +class Hashtable { + unordered_map 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; +}