diff --git a/.gitignore b/.gitignore index fbff541..6d3f1b5 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ tmp/ fsorter .ccls-cache/ CMakeFiles/ +settings.conf diff --git a/main.cpp b/main.cpp index 1aad191..f2db91f 100644 --- a/main.cpp +++ b/main.cpp @@ -1,192 +1,152 @@ #include #include #include +#include //#include #include -using namespace std; -namespace fs = filesystem; -string path; -int numpaths; -string searpath(){ - string der; - cout<< "what is the directory you want to search?:\t"; - cin >> der; - return der; +std::string musicTypes[] = {".mp3",".wav"}; +std::string pictureType[] = {".jpg","jpeg","png"}; +namespace fs = std::filesystem; +std::string home = getenv("HOME"); +std::string settingsPath = home+"/.config/fsorter/settings.conf"; +std::string sortingPath = fs::current_path(); +class typeAndPaths{ + public: + std::string type; + std::string path; + std::vector extentions; +}; + +void writeSettins() +{ + std::ofstream settings(settingsPath); + settings << "Picture=\n"+ home +"/Pictures/\n.jpg,.jpeg,.png," << std::endl; + settings << "Music=\n"+home+"/Music/\n.mp3,.wav," << std::endl; + settings << "Video=\n"+home+"/Videos/\n.mp4," << std::endl; + settings << "Arcive=\n"+home+"/Documents/Compressed/\n.zip,.rar,.7z," << std::endl; + settings.close(); } -// string* getsettings(){ -// ifstream myfile; -// myfile.open("settings.txt"); -// string str = ""; -// int i = 0; -// if (myfile.is_open()) { -// while (getline(myfile, str)) { -// if (str.find("^")!= string::npos){ -// i += 1; -// } -// } -// myfile.close(); -// } -// myfile.open("settings.txt"); -// if (myfile.is_open()) { -// cout << i << "\n"; -// string* fSettings = new string[i]; -// i = 0; -// while (getline(myfile, str)) { -// fSettings[i] = str; -// i += 1; -// } -// numpaths = i; -// myfile.close(); -// return fSettings; -// } -// } +std::vector readSettings() +{ + if(!fs::exists(settingsPath)) + { + fs::create_directory(home + "/.config/fsorter/"); + } + std::ifstream settings(settingsPath); + std::vector listOfPaths; + std::string setting; + // creates a default settins file + if(!settings) + { + writeSettins(); + } + if(settings) + { + while(getline(settings, setting)) + { + listOfPaths.push_back(setting); + } + } + settings.close(); + return listOfPaths; +} +std::vector declarePaths(std::vector listOfPaths) +{ + typeAndPaths Paths; + std::vector paths; + for (int i = 0; i < listOfPaths.size(); i+=3) + { + listOfPaths[i].pop_back(); + Paths.type = listOfPaths[i]; + Paths.path = listOfPaths[i+1]; + std::string stringExtentions = listOfPaths[i+2]; + std::vector extentions; + char temp; + std::string tempWord; + int counter = 0; + for (int i = 0; i < stringExtentions.size(); i++) { + temp = stringExtentions[i]; + if(temp != ',') + { - -void search() { - path = searpath(); - if (fs::exists(path)) { - for (const auto &entry : fs::directory_iterator(path)) { - if (entry.path().string().find("/.") == string::npos) { - - if (entry.path().has_extension()) { - cout << entry.path() << std::endl; - //// check if it is video file - if (entry.path().extension() == ".mp4" || entry.path().extension() == ".mkv") { - fs::rename(entry.path().string(), "/home/mrfluffy/Videos/" + entry.path().filename().string()); - } else if (entry.path().extension() == ".jpeg" || entry.path().extension() == ".jpg" || - entry.path().extension() == ".png") { - fs::rename(entry.path().string(), - "/home/mrfluffy/Pictures/" + entry.path().filename().string()); - } - else if (entry.path().extension() == ".mp3" ){ - fs::rename(entry.path().string(), - "/home/mrfluffy/Music/" + entry.path().filename().string()); - } - else if (entry.path().extension() == ".pdf") { - fs::rename(entry.path().string(), - "/home/mrfluffy/Documents/PDF/" + entry.path().filename().string()); - } else if (entry.path().extension() == ".docx") { - fs::rename(entry.path().string(), - "/home/mrfluffy/Documents/DOCX/" + entry.path().filename().string()); - } else if (entry.path().extension() == ".jar") { - fs::rename(entry.path().string(), - "/home/mrfluffy/Documents/JAR/" + entry.path().filename().string()); - } else if (entry.path().extension() == ".zip" || entry.path().extension() == ".rar" || - entry.path().extension() == ".zst" || entry.path().extension() == ".gz" || entry.path().extension() == ".xz"){ - fs::rename(entry.path().string(), - "/home/mrfluffy/Documents/Compressed/" + entry.path().filename().string()); - } else if (entry.path().extension() == ".iso") { - fs::rename(entry.path().string(), - "/home/mrfluffy/Documents/DiscImages/" + entry.path().filename().string()); - } + tempWord.push_back(temp); + } + else + { + extentions.push_back(tempWord); + tempWord = ""; + counter++; + } + } + Paths.extentions = extentions; + paths.push_back(Paths); + } + return paths; +} +void checkSettingsPaths(std::vector Paths) +{ + for (int i = 0; i < Paths.size(); i++) + { + if(fs::exists(Paths[i].path)) + { + std::cout << "Yes\n"; + } + else + { + bool valid = false; + while (!valid) { + char awnser; + std::cout << "would you like to create y=yes, n=no : " << Paths[i].path << "\t"; + std::cin >> awnser; + std::cout << '\n'; + if(tolower(awnser) == 'y') + { + fs::create_directory(Paths[i].path); + std::cout << "Directorry " << Paths[i].path << " was created\n"; + valid = true; + } + else if (tolower(awnser) == 'n') + { + std::cout << "Directory" << Paths[i].path <<" was not created\n"; + valid = true; + } + else + { + std::cout << "pleas provide valid awnser" << std::endl; } } } } - else{ - cout << "Enter valid directory.\n"; - search(); - } } -void changepath(string nepathS){ - string newpath; - fstream myfile; - myfile.open("settings.txt"); - string str = ""; - int i = 0; - if (myfile.is_open()) { - while (getline(myfile, str)) { - if (str.find("^")!= string::npos){ - i += 1; + +void sortPath(std::string path, std::vector Paths) +{ + for(auto const& file: fs::directory_iterator{path}) + { + if(file.path().has_extension()) + { + std::cout << file.path().extension() << '\n'; + for (int i = 0; i < Paths.size(); i++) { + for (int x = 0; x < Paths[i].extentions.size(); x++) { + if(Paths[i].extentions[x] == file.path().extension()) + { + fs::rename(file.path().string(), Paths[i].path + file.path().filename().string()); + } + } } } - myfile.close(); - } - myfile.open("settings.txt"); - if (myfile.is_open()){ - cout << i << "\n"; - string settings[i]; - i=0; - while (getline(myfile, str)) { - settings[i] = str; - i += 1; - } - myfile.close(); - ofstream temp("temp.txt"); - for (int j = 0; j < i; ++j) { - if (settings[j].find(nepathS)!= string::npos){ - cout << "Enter new path.:\t"; - cin >> newpath; - settings[j] = nepathS + " " + newpath; - } - int t = j; - temp << settings[t] + "\n"; - } - temp.close(); - remove("settings.txt"); - rename("temp.txt","settings.txt"); - } - return; -} -void settings(){ -// system("clear"); - cout << "Change output location for.\n"; - cout << "1. Videos\n"; - cout << "2. Music\n"; - cout << "3. Pictures\n"; - cout << "4. Pdf\n"; - cout << "5. Docx\n"; - cout << "6. Jar\n"; - cout << "7. Disc Images\n"; - int settingmenu; - cin >> settingmenu; - switch (settingmenu) { - case 1:{ - changepath("^Videos"); - break; - } - case 2: - changepath("^Music"); - break; - case 3: - changepath("^Pictures"); - break; - case 4: - changepath("^Pdf"); - break; - case 5: - changepath("^Docx"); - break; - case 6: - changepath("^Jar"); - break; - case 7: - changepath("^DiscIMage"); - break; - } -} -int main() { -// system("clear"); - cout << "1. Sort a directory.\n"; - cout << "2. settings.\n"; - cout << "3. exit.\n"; - int menu; - cin >> menu; - switch (menu) { - case 1:{ - search(); -// string* settingslist = getsettings(); -// for (int i = 0; i < numpaths; ++i) { -// cout << settingslist[i] << "\n"; -// } - main(); - } - case 2: - settings(); - main(); - case 3: - exit(3); + } } +int main() +{ + std::vector listOfPaths = readSettings(); + std::vector Paths = declarePaths(listOfPaths); + checkSettingsPaths(Paths); + sortPath(sortingPath, Paths); + return 0; +} + +