חזור לתיקייה: files

Directory

חיפוש בתיקיה
Ctrl K
לחץ כאן או הקש Ctrl K כדי לחפש בכל התיקיה

    Directory

    02340124

    מבוא לתכנות מערכות

    רשימות הרצאה לקריאה בשבת

    Directory

    הופק מתוך תקיית התואר של שקד

    uni-folder.vercel.app

    directory.cpp

    הערה (קובץ קוד)

    קובץ זה הוא קובץ קוד מסוג CPP.

    #include "Directory.h"
    
    #include <list>
    #include <stdexcept>
    
    #include "CreateAction.h"
    #include "DeleteAction.h"
    #include "ReadAction.h"
    #include "SearchAction.h"
    #include "Utilities.h"
    
    Directory::Directory(const std::string &name,  Directory* parent)
        : File(name, parent), files(std::list<std::shared_ptr<File>>()) { }
    
    File& Directory::operator[](std::list<std::string> path) {
        if (path.empty()) {
            return *this;
        }
    
        std::shared_ptr<File> file = find(path.front()); // searches the folder/file
    
        if (file == nullptr) {
            throw std::runtime_error(Utilities::FileNotFoundMsg());
        }
    
        path.pop_front(); // removes the path we were at
        return (*file)[path];
    }
    
    const File& Directory::operator[](std::list<std::string> path) const // the same as above
    {
        if (path.empty()) { return *this; }
    
        std::shared_ptr<File> file = find(path.front());
    
        if (file == nullptr) { throw std::runtime_error(Utilities::FileNotFoundMsg()); }
    
        path.pop_front();
        return (*file)[path];
    }
    
    std::unique_ptr<Action> Directory::CreateCreateAction(WriteRequest& request) {
        return std::unique_ptr<Action>(
            new CreateAction(request.name, request.type, request.linesVector, *this)
        );
    }
    
    std::unique_ptr<Action> Directory::CreateDeleteAction(WriteRequest& request) {
        return std::unique_ptr<Action>(
            new DeleteAction(*this, request.name)
        );
    }
    
    std::unique_ptr<Action> Directory::CreateReadAction(ReadRequest& request) const {
        std::vector<std::string> vector;
        for (const std::shared_ptr<File>& file : files) {
            vector.push_back(" - " + file->getName());
        }
        return std::unique_ptr<Action>(
            new ReadAction(request.hostPath, vector, request.isCout)
        );
    }
    
    std::unique_ptr<Action> Directory::CreateWriteAction(WriteRequest& request) {
        throw std::runtime_error(Utilities::TypeErrorMsg());
    }
    
    std::unique_ptr<Action> Directory::CreateSearchAction(SearchRequest &request) const
    {
        std::vector<std::string> linesToPrint;
    
        SearchRequest sendDown = {
            request.searchTerm,
            true,
            request.comesFromCreateSearchAction
                ? request.printingVector
                : linesToPrint,
            request.pathFromLocation + "/" + getName()
        };
    
        for (const std::shared_ptr<File>& file : files)
        {
            file->CreateSearchAction(sendDown);
        }
    
        return request.comesFromCreateSearchAction
            ? nullptr
            : std::unique_ptr<Action>(new SearchAction(sendDown.printingVector));
    }
    
    bool Directory::canBeDeleted() const {
        return files.empty();
    }
    
    void Directory::addFile(std::shared_ptr<File> file) {
        for (const std::shared_ptr<File>& temp : files) {
            if (temp->getName() == file-> getName()) {
                throw std::runtime_error(Utilities::commandErrorMsg());
            }
        }
        files.push_back(file);
    }
    
    void Directory::removeFile(const std::string& name) {
        for (auto it = files.begin(); it != files.end(); ++it) {
            if ((*it)->getName() == name) {
                if ((*it)->canBeDeleted()) {
                    files.erase(it);
                    return;
                }
                throw std::runtime_error(Utilities::DirectoryNotEmptyMsg());
            }
        }
        throw std::runtime_error(Utilities::FileNotFoundMsg());
    }
    
    std::shared_ptr<File> Directory::find(const std::string &name) const
    {
        for (const std::shared_ptr<File>& file : files)
        {
            if (file->getName() == name) {
                return file;
            }
        }
    
        return nullptr;
    }