博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CareerCup] 8.9 An In-memory File System 内存文件系统
阅读量:7038 次
发布时间:2019-06-28

本文共 2552 字,大约阅读时间需要 8 分钟。

8.9 Explain the data structures and algorithms that you would use to design an in-memory file system. Illustrate with an example in code where possible.

这道题让我们设计一个内存文件系统,咋一听感觉挺吓人啊,像是很底层的东西,但其实只是一道很普通的OOB的题目而已。根据书上所述,在一个简化的文件系统,由文件和目录构成的,而文件类File和目录类Directory都是由一个入口类Entry派生而来的,可参见如下代码:

class Directory;class Entry {public:    Entry(string n, Directory *p) {        _name = n;        _parent = p;        _created = getCurrentTimeMillis();    }    static long getCurrentTimeMillis() {        time_t res = time(NULL);        localtime(&res);        return (long)res;    }    bool deleteEntry() {        if (_parent == nullptr) return false;        return _parent->deleteEntry(this);    }    virtual int size() = 0;    string getFullPath() {        if (_parent == nullptr) return _name;        else return _parent->getFullPath() + "/" + _name;    }    long getCreationTime() { return _created; }    long getLastUpdatedTime() { return _lastUpdated; }    long getLastAccessedTime() { return _lastAccessed; }    void changeName(string n) { _name = n; }    string getName() { return _name; }protected:    Directory *_parent;    long _created;    long _lastUpdated;    long _lastAccessed;    string _name;};class File: public Entry {public:    File(string n, Directory *p, int sz): Entry(n, p) {        _size = sz;    }    int size() { return _size; }    string getContents() { return _content; }    void setContents(string c) { _content = c; }private:    string _content;    int _size;};class Directory: public Entry {public:    Directory(string n, Directory *p): Entry(n, p) {}    int size() {        int size = 0;        for (auto a : _contents) {            size += a->size();        }        return size;    }    int numberOfFiles() {        int cnt = 0;        for (auto a : _contents) {            if (Directory *d = dynamic_cast
(a)) { ++cnt; cnt += d->numberOfFiles(); } else if (File *f = dynamic_cast
(a)) { ++cnt; } } return cnt; } bool deleteEntry(Entry *entry) { for (vector
::iterator it = _contents.begin(); it != _contents.end(); ++it) { if (*it == entry) { _contents.erase(it); } } } void addEntry(Entry *entry) { _contents.push_back(entry); }protected: vector
_contents; vector
getContents() { return _contents; }};

本文转自博客园Grandyang的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
GitHub Universe 大会总结:信息流推荐开源库,推出社区功能
查看>>
如何构建自定义人脸识别数据集
查看>>
码农,有趣的灵魂...
查看>>
Mac编译Hadoop源码
查看>>
【翻译】深入理解ES6的模块
查看>>
通用对话框QMessageBox
查看>>
JavaScript数组API汇总
查看>>
如何理解Java静态?
查看>>
用 Golang 写一个搜索引擎 (0x04) --- B + 树
查看>>
检测php网站是否已经被攻破的方法
查看>>
iOS VIPER架构实践(二):VIPER详解与实现
查看>>
[译]在HealthKit中用 Swift 进行睡眠分析
查看>>
【刷算法】数组中出现次数超过一半的数字
查看>>
基于ZK實現分布式锁
查看>>
ReactNative 进阶之Form表单组件封装
查看>>
JavaScript也能写WebAssembly
查看>>
android studio Font设置备忘
查看>>
iOS核心动画高级技术(九) 图层时间
查看>>
原生App与javascript交互之JSBridge接口原理、设计与实现
查看>>
GitLab首席执行官Sid Sijbrandij畅谈当前开发实践
查看>>