#include #include #include #include #include #include #include #include #include using std::string; using json = nlohmann::json; const int VERSION_MAJOR = 0; const int VERSION_MINOR = 1; enum Flags { EMPTY_FILES = 0x1, EMPTY_DIRECTORIES = 0x2 }; // DWORD GetModuleFileNameA( // [in, optional] HMODULE hModule, // [out] LPSTR lpFilename, // [in] DWORD nSize // ); struct DirectoryEntry { std::filesystem::path path; unsigned char flags = EMPTY_DIRECTORIES | EMPTY_FILES; std::chrono::duration olderThan = std::chrono::duration(0); void clear() { path = std::filesystem::path(); flags = EMPTY_DIRECTORIES | EMPTY_FILES; olderThan = std::chrono::duration(0); } }; string getVersion() { return std::to_string(VERSION_MAJOR)+"."+std::to_string(VERSION_MINOR); } void print_usage() { std::cout << "--------------------------\n"<< "Cleaner version " << getVersion() << "\n--------------------------\n"; std::cout << "\tUsage:\n\t\tcleaner\n"; } bool createDefaultConfig() { LPSTR lpFilename; DWORD nSize = 256; DWORD len; len = GetModuleFileName(NULL, lpFilename, nSize); OutputDebugString(lpFilename); json config; config["version"] = getVersion(); config["directories"][0]["directory"] = "C:/dev/temp"; config["directories"][0]["rules"]["empty_directories"] = true; config["directories"][0]["rules"]["empty_files"] = true; config["directories"][0]["rules"]["age"] = "30d"; string output = config.dump(4); std::ofstream f("cleaner.json"); if (f.is_open()) { f << output << std::endl; f.close(); return true; } return false; // Return file handle? } void cleanEntries(std::vector& entries) { for(auto& entry : entries) { std::cout << entry.path.string() << "\n"; } } std::chrono::duration parseAge(string age) { //TODO (Eero): parse age i.e. 30d return std::chrono::duration(0); } void parseConfig(std::vector& entries) { if(!std::filesystem::exists(std::filesystem::path("./cleaner.json"))) { std::cout << "Didn't find cleaner.json. Creating default configuration into cleaner.json.\n"; // Create cleaner.json if(!createDefaultConfig()) { // Failed to create file for some reason. Exit from function. return; } } //TODO (Eero): Check version here std::ifstream f("cleaner.json"); json config = json::parse(f); std::cout << "Config version: " << config["version"].template get() << "\n"; // Iterate directories DirectoryEntry entry = {}; for (auto& element : config["directories"]) { if(element.is_string()) { entry.path = std::filesystem::path(element.template get()); entries.push_back(entry); entry.clear(); continue; } entry.path = std::filesystem::path(element["directory"].template get()); //TODO (Eero): Check if rules exists for(json::iterator it = element["rules"].begin(); it != element["rules"].end();++it) { if(it.key() == "empty_directories") { entry.flags |= EMPTY_DIRECTORIES; } if(it.key() == "empty_files") { entry.flags |= EMPTY_FILES; } if(it.key() == "age") { entry.olderThan = parseAge(it.value()); } } entries.push_back(entry); entry.clear(); } } int main(int argc, char const *argv[]) { if(argc>1){ print_usage(); return 0; } std::vector entries = {}; const auto start = std::chrono::steady_clock::now(); parseConfig(entries); cleanEntries(entries); const auto end = std::chrono::steady_clock::now(); const std::chrono::duration elapsed_seconds{end - start}; std::cout << "Cleaner finished after " << elapsed_seconds.count() << "s\n"; return 0; }