Реализовать терминальный файловый менеджер. Файловый менеджер должен уметь выполнять введенные команды от пользователя:
– remove ${file} (удалить файл, пример remove ./test.txt)
– create ${file} (создать файл, пример create ./test.txt)
– exists ${file} (проверить существование файла, пример create ./test.txt)
– info ${file} (получить информацию о файле, пример info ./test.txt)
– copy ${file1} ${file2} (скопировать файл, пример copy ./test.txt /tmp/test.txt)
– move ${file1} ${file2} (переместить файл, пример move ./test.txt /tmp/test.txt)
– rename ${file} ${new_file} (переименовать файл, пример rename ./test.txt ./new_test.txt)
C++
cpp
#include <iostream>
#include <fstream>
#include <sys/stat.h>
class FileManager {
public:
void remove(const std::string& file);
void create(const std::string& file);
bool exists(const std::string& file);
void info(const std::string& file);
void copy(const std::string& file1, const std::string& file2);
void move(const std::string& file1, const std::string& file2);
void rename(const std::string& file, const std::string& new_file);
private:
bool fileExists(const std::string& file);
std::string getFileExtension(const std::string& file);
std::string getFileName(const std::string& file);
};
void FileManager::remove(const std::string& file) {
if (std::remove(file.c_str()) == 0) {
std::cout << "File removed successfully." << std::endl;
} else {
std::cout << "Failed to remove file." << std::endl;
}
}
void FileManager::create(const std::string& file) {
std::ofstream output(file);
if (output.is_open()) {
std::cout << "File created successfully." << std::endl;
output.close();
} else {
std::cout << "Failed to create file." << std::endl;
}
}
bool FileManager::exists(const std::string& file) {
if (fileExists(file)) {
std::cout << "File exists." << std::endl;
return true;
} else {
std::cout << "File does not exist." << std::endl;
return false;
}
}
void FileManager::info(const std::string& file) {
if (fileExists(file)) {
struct stat fileStat;
if (stat(file.c_str(), &fileStat) == 0) {
std::cout << "File Information:" << std::endl;
std::cout << "Name: " << getFileName(file) << std::endl;
std::cout << "Extension: " << getFileExtension(file) << std::endl;
std::cout << "Size: " << fileStat.st_size << " bytes" << std::endl;
std::cout << "Permissions: " << (fileStat.st_mode & 0777) << std::endl;
} else {
std::cout << "Failed to get file information." << std::endl;
}
}
}
void FileManager::copy(const std::string& file1, const std::string& file2) {
std::ifstream input(file1, std::ios::binary);
std::ofstream output(file2, std::ios::binary);
if (input.is_open() && output.is_open()) {
output << input.rdbuf();
std::cout << "File copied successfully." << std::endl;
input.close();
output.close();
} else {
std::cout << "Failed to copy file." << std::endl;
}
}
void FileManager::move(const std::string& file1, const std::string& file2) {
if (rename(file1.c_str(), file2.c_str()) == 0) {
std::cout << "File moved successfully." << std::endl;
} else {
std::cout << "Failed to move file." << std::endl;
}
}
void FileManager::rename(const std::string& file, const std::string& new_file) {
if (rename(file.c_str(), new_file.c_str()) == 0) {
std::cout << "File renamed successfully." << std::endl;
} else {
std::cout << "Failed to rename file." << std::endl;
}
}
bool FileManager::fileExists(const std::string& file) {
std::ifstream input(file);
return input.good();
}
std::string FileManager::getFileExtension(const std::string& file) {
size_t dotIndex = file.find_last_of(".");
if (dotIndex != std::string::npos) {
return file.substr(dotIndex + 1);
}
return "";
}
std::string FileManager::getFileName(const std::string& file) {
size_t slashIndex = file.find_last_of("/");
if (slashIndex != std::string::npos) {
return file.substr(slashIndex + 1);
}
return file;
}
Теперь, когда у нас есть класс FileManager с функциями для работы с файлами, можем реализовать функцию main, которая будет взаимодействовать с пользователем и вызывать соответствующие функции FileManager:
cpp
int main() {
FileManager fileManager;
std::string command;
while (true) {
std::cout << "Enter a command: ";
std::cin >> command;
if (command == "remove") {
std::string file;
std::cin >> file;
fileManager.remove(file);
} else if (command == "create") {
std::string file;
std::cin >> file;
fileManager.create(file);
} else if (command == "exists") {
std::string file;
std::cin >> file;
fileManager.exists(file);
} else if (command == "info") {
std::string file;
std::cin >> file;
fileManager.info(file);
} else if (command == "copy") {
std::string file1, file2;
std::cin >> file1 >> file2;
fileManager.copy(file1, file2);
} else if (command == "move") {
std::string file1, file2;
std::cin >> file1 >> file2;
fileManager.move(file1, file2);
} else if (command == "rename") {
std::string file, new_file;
std::cin >> file >> new_file;
fileManager.rename(file, new_file);
} else if (command == "exit") {
break;
} else {
std::cout << "Unknown command." << std::endl;
}
}
return 0;
}
Теперь можно компилировать и запускать программу. Пользователь будет видеть приглашение для ввода команды, после чего может вводить команды и соответствующие аргументы. Например, чтобы удалить файл `test.txt`, нужно ввести команду `remove ./test.txt`.
Программа будет последовательно выполнять команды пользователя и выводить информацию о выполнении каждой команды.
Реализация вышеобозначенного кода является одним из вариантов решения задачи. Все выборы и решения, связанные с деталями реализации, остаются за вами. Код может быть доработан или оптимизирован в зависимости от конкретных требований или ограничений вашего проекта.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет