diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 23c0d36..2e00b15 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -13,4 +13,4 @@ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Werror -O2") set(EXECUTABLE_OUTPUT_PATH ../bin) -add_executable(broom ../src/main.cpp) +add_executable(broom ../src/main.cpp ../src/entry.cpp ../src/broom.cpp) diff --git a/src/broom.cpp b/src/broom.cpp index ca7fb44..611c80d 100644 --- a/src/broom.cpp +++ b/src/broom.cpp @@ -17,53 +17,45 @@ You should have received a copy of the GNU General Public License along with broom. If not, see . */ +#include #include "entry.hpp" +#include "broom.hpp" -// A class to find and manage duplicate files -class Broom { -protected: - // how many files has been "sweeped" - uintmax_t m_sweeped_files; - // how many bytes was freed - uintmax_t m_sweeped_size; +Broom::Broom() {}; +Broom::~Broom() {}; -public: - Broom() {}; - ~Broom() {}; - - // Print current statistics - void print_statistics() { - std::cout - << "| sweeped " << m_sweeped_files << " files" << std::endl - << "| with a total size of " << m_sweeped_size << " bytes" << std::endl - << std::endl; - }; - - // Determines whether entry1 is a duplicate of entry2 - bool is_duplicate(Entry entry1, Entry entry2) { - if (entry1.path == entry2.path) { - // well, it`s the same file we`re talking about - return false; - } - else if (entry1.compare_checksums(entry2.checksum)) { - return true; - } +// Print current statistics +void Broom::print_statistics() { + std::cout + << "| sweeped " << m_sweeped_files << " files" << std::endl + << "| with a total size of " << m_sweeped_size << " bytes" << std::endl + << std::endl; +}; +// Determines whether entry1 is a duplicate of entry2 +bool Broom::is_duplicate(Entry entry1, Entry entry2) { + if (entry1.path == entry2.path) { + // well, it`s the same file we`re talking about return false; - }; + } + else if (entry1.compare_checksums(entry2.checksum)) { + return true; + } - // find all duplicates in the directory - int find_duplicates(std::filesystem::path directory, Entry entries[], bool recursive = false) { - return 0; - }; + return false; +}; - // remove ALL duplicate files - int sweep_all(Entry entries[]) { - return 0; - }; +// find all duplicates in the directory +int Broom::find_duplicates(std::filesystem::path directory, Entry entries[], bool recursive = false) { + return 0; +}; + +// remove ALL duplicate files +int Broom::sweep_all(Entry entries[]) { + return 0; +}; - // remove ALL duplicates but the one with specified index - int sweep_all_but(Entry entries[], uint32_t index = 0) { - return 0; - }; +// remove ALL duplicates but the one with specified index +int Broom::sweep_all_but(Entry entries[], uint32_t index = 0) { + return 0; }; diff --git a/src/broom.hpp b/src/broom.hpp index 1d72b3b..342ff22 100644 --- a/src/broom.hpp +++ b/src/broom.hpp @@ -17,11 +17,10 @@ You should have received a copy of the GNU General Public License along with broom. If not, see . */ -# ifndef BROOM_HPP -# define BROOM_HPP +#ifndef BROOM_HPP +#define BROOM_HPP #include -#include // A class to find and manage duplicate files class Broom { @@ -32,8 +31,8 @@ protected: uintmax_t m_sweeped_size; public: - Broom() {}; - ~Broom() {}; + Broom(); + ~Broom(); // Print current statistics void print_statistics(); @@ -42,13 +41,13 @@ public: bool is_duplicate(Entry entry1, Entry entry2); // find all duplicates in the directory - int find_duplicates(std::filesystem::path directory, Entry entries[], bool recursive = false); + int find_duplicates(std::filesystem::path directory, Entry entries[], bool recursive); // remove ALL duplicate files int sweep_all(Entry entries[]); // remove ALL duplicates but the one with specified index - int sweep_all_but(Entry entries[], uint32_t index = 0); + int sweep_all_but(Entry entries[], uint32_t index); }; -# endif +#endif diff --git a/src/entry.cpp b/src/entry.cpp index 487cb96..08e1252 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -20,34 +20,38 @@ along with broom. If not, see . #include "entry.hpp" // A wrapper for every file with all necessary information -class Entry { -public: - Entry(std::filesystem::path path) { - // check for existense and being a directory - if (!std::filesystem::exists(path) || std::filesystem::is_directory(path)) { - throw "Does not exist or a directory"; - }; +Entry::Entry(std::filesystem::path path) { + // check for existense and being a directory + if (!std::filesystem::exists(path) || std::filesystem::is_directory(path)) { + throw "Does not exist or a directory"; + }; - // filename - filename = path.filename(); + // filename + filename = path.filename(); - // filesize - filesize = std::filesystem::file_size(path); + // filesize + filesize = std::filesystem::file_size(path); - // checksum - std::fstream entry_file; - entry_file.open(path); + // checksum + std::fstream entry_file; + entry_file.open(path); - if (!entry_file.is_open()) { - throw "Could not open file"; - } + if (!entry_file.is_open()) { + throw "Could not open file"; + } + // TODO(Properly test it) + if (filesize <= CHECKSUM_SIZE) { + entry_file.read(checksum, CHECKSUM_SIZE); + } else { char start_buf[CHUNK_SIZE]; entry_file.read(start_buf, CHUNK_SIZE); + entry_file.seekg(CHUNK_SIZE, std::ios::end); char end_buf[CHUNK_SIZE]; entry_file.read(end_buf, CHUNK_SIZE); + entry_file.seekg(CHUNK_SIZE, std::ios::beg); char middle_buf[CHUNK_SIZE]; entry_file.read(middle_buf, CHUNK_SIZE); @@ -64,26 +68,23 @@ public: }; }; - ~Entry() {}; + entry_file.close(); +}; - std::string filename; - std::filesystem::path path; - uintmax_t filesize; - char checksum[CHECKSUM_SIZE]; +Entry::~Entry() {}; - // Compare this entry`s checksum with the other one. - // If the checksums are the same -> returns true, else -> false - bool compare_checksums(char other_checksum[CHECKSUM_SIZE]) { - for (uint8_t i = 0; i < CHECKSUM_SIZE; i++) { - if (checksum[i] != other_checksum[i]) { - return false; - }; +// Compare this entry`s checksum with the other one. +// If the checksums are the same -> returns true, else -> false +bool Entry::compare_checksums(char other_checksum[CHECKSUM_SIZE]) { + for (uint8_t i = 0; i < CHECKSUM_SIZE; i++) { + if (checksum[i] != other_checksum[i]) { + return false; }; - return true; }; + return true; +}; - // Remove entity from the disk - void remove() { - std::filesystem::remove(path); - }; +// Remove entry from the disk +void Entry::remove() { + std::filesystem::remove(path); }; diff --git a/src/entry.hpp b/src/entry.hpp index 1a24581..56faf75 100644 --- a/src/entry.hpp +++ b/src/entry.hpp @@ -17,8 +17,8 @@ You should have received a copy of the GNU General Public License along with broom. If not, see . */ -# ifndef ENTRY_HPP -# define ENTRY_HPP +#ifndef ENTRY_HPP +#define ENTRY_HPP #include #include @@ -30,21 +30,22 @@ const uint8_t CHECKSUM_SIZE = CHUNK_SIZE * 3; // A wrapper for every file with all necessary information class Entry { public: - Entry(std::filesystem::path path); - ~Entry(); - std::string filename; std::filesystem::path path; uintmax_t filesize; char checksum[CHECKSUM_SIZE]; + + Entry(std::filesystem::path path); + ~Entry(); + // Compare this entry`s checksum with the other one. // If the checksums are the same -> returns true, else -> false bool compare_checksums(char other_checksum[CHECKSUM_SIZE]); - // Remove entity from the disk + // Remove entry from the disk void remove(); }; -# endif +#endif diff --git a/src/main.cpp b/src/main.cpp index b49aabd..5386773 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -98,8 +98,9 @@ int main(int argc, char* argv[]) { // printing all directories just for testing for (uint32_t i = 0; i < options.paths.size(); i++) { for (auto& p : std::filesystem::recursive_directory_iterator(options.paths.at(i))) { - if (p.is_directory()) { - std::cout << p.path() << std::endl; + if (!p.is_directory()) { + Entry entry(p); + std::cout << p.path() << "Checksum: " << entry.checksum << std::endl; } }; };