http://www.careercup.com/question?id=13618661
1> Use Structure with n children, on parent pointer , one data field and one name field.
2> Use this Structure to make N ary Tree with parent Child relationship. We can use inheritance feature of OOPs here.
3> Now we can use this structure to make Files/Folder accourdingly.
if Files that it parent pointer points to the Folder where it belongs with all its child pointer pointing to NULL and struct->data is the File Content.
else if Folder . point it parent point to it Parent Folder while Child still pointing to NULL but its Struct->data as NULL.
that way we can differentiate between file /folder and maintain its relationship.
Main Class
AbstractFile
File
Folder
Permission
Singleton FileSystem Manager Object
maybe command line desgin pattern
Command Interpreter: translate shell command to API call.
MetaData, FileSystem(root class, facada).
http://www.shuatiblog.com/blog/2014/08/25/design-in-memory-file-system/
A file system consists of Files and Directories. Each Directory contains a set of Files and Directories.
Since Files and Directories share so many characteristics, we’ve implemented them such that they inherit from the same class — Entry.
1> Use Structure with n children, on parent pointer , one data field and one name field.
2> Use this Structure to make N ary Tree with parent Child relationship. We can use inheritance feature of OOPs here.
3> Now we can use this structure to make Files/Folder accourdingly.
if Files that it parent pointer points to the Folder where it belongs with all its child pointer pointing to NULL and struct->data is the File Content.
else if Folder . point it parent point to it Parent Folder while Child still pointing to NULL but its Struct->data as NULL.
that way we can differentiate between file /folder and maintain its relationship.
Main Class
AbstractFile
File
Folder
Permission
Singleton FileSystem Manager Object
maybe command line desgin pattern
class TPermission
{
public:
string name;
enum {full_access, read_only, write, read};
};
https://tianrunhe.wordpress.com/2012/03/24/design-an-in-memory-file-system/Command Interpreter: translate shell command to API call.
MetaData, FileSystem(root class, facada).
struct
DataBlock {
char
data[DATA_BLOCK_SIZE]; };
DataBlock dataBlocks[NUM_DATA_BLOCKS];
struct
INode { std::vector<
int
> datablocks; };
struct
MetaData {
int
size;
Date last_modifed, created;
char
extra_attributes;
};
std::vector<
bool
> dataBlockUsed(NUM_DATA_BLOCKS);
std::map<string, INode *> mapFromName;
struct
FSBase;
struct
File :
public
FSBase {
private
:
std::vector<INode> * nodes;
MetaData metaData;
};
struct
Directory : pubic FSBase { std::vector<FSBase* > content; };
struct
FileSystem {
init();
mount(FileSystem*);
unmount(FileSystem*);
File createFile(cosnt
char
* name) { ... }
Directory createDirectory(
const
char
* name) { ... }
// mapFromName to find INode corresponding to file
void
openFile(File * file, FileMode mode) { ... }
void
closeFile(File * file) { ... }
void
writeToFile(File * file,
void
* data,
int
num) { ... }
void
readFromFile(File* file,
void
* res,
int
numbutes,
int
position) { ... }
};
A file system consists of Files and Directories. Each Directory contains a set of Files and Directories.
Since Files and Directories share so many characteristics, we’ve implemented them such that they inherit from the same class — Entry.
UML diagram -> composite pattern.
http://www.cs.cornell.edu/slk/jk-0.91/doc/jkernel/tutorial/tutorial-4.html
http://stackoverflow.com/questions/5629116/simple-in-memory-file-system
http://www.flipcode.com/archives/Programming_a_Virtual_File_System-Part_I.shtml
Java code: https://github.com/marschall/memoryfilesystem
Read full article from Design an in-memory file system | Runhe Tian Coding Practice
public abstract class Entry {
protected Directory parent;
protected long created;
protected long lastUpdated;
protected long lastAccessed;
protected String name;
public Entry(String n, Directory p) {
name = n;
parent = p;
created = System.currentTimeMillis();
}
public boolean delete() {
if (parent == null) {
return false;
}
return parent.deleteEntry(this);
}
public abstract int size();
public String getFullPath() {
if (parent == null) {
return name;
} else {
return parent.getFullPath() + "/" + name;
}
}
}
public class File extends Entry {
private String content;
private int size;
public File(String n, Directory p, int sz) {
super(n, p);
size = sz;
}
}
public class Directory extends Entry {
protected ArrayList<Entry> contents;
public Directory(String n, Directory p) {
super(n, p);
contents = new ArrayList<Entry>();
}
protected ArrayList<Entry> getContents() {
return contents;
}
public int size() {
int size = 0;
for (Entry e : contents) {
size += e.size();
}
return size;
}
public int numberOfFiles() {
int count = 0;
for (Entry e : contents) {
if (e instanceof Directory) {
count++; // Directory counts as a file
Directory d = (Directory) e;
count += d.numberOfFiles();
} else if (e instanceof File) {
count++;
}
}
return count;
}
public boolean deleteEntry(Entry entry) {
return contents.remove(entry);
}
public void addEntry(Entry entry) {
contents.add(entry);
}
}
http://www.cs.cornell.edu/slk/jk-0.91/doc/jkernel/tutorial/tutorial-4.html
public class MemFileSystemImpl implements MemFileSystem { Hashtable files = new Hashtable(); // maps Strings to byte arrays public void writeFile(String name, byte[] contents) { files.put(name, contents); } public byte[] readFile(String name) throws FileNotFoundException { byte[] contents = (byte[]) files.get(name); if(contents == null) throw new FileNotFoundException(name); else return contents; } }
public class MemFileInputStream extends InputStream { private ByteArrayInputStream bStream; public MemFileInputStream(String name) throws FileNotFoundException { byte[] b; try { b = MemFileSystemAdaptor.fileSystem.readFile(name); } catch(RemoteException e) {throw new FileNotFoundException(e.toString());} bStream = new ByteArrayInputStream(b); } public int available() {return bStream.available();} public void close() {} public int read() {return bStream.read();} public int read(byte[] b) {return bStream.read(b, 0, b.length);} public int read(byte[] b, int off, int len) {return bStream.read(b, off, len);} public long skip(long n) {return bStream.skip(n);} }
public class MemFileOutputStream extends OutputStream { private ByteArrayOutputStream bStream = new ByteArrayOutputStream(); private String name; public MemFileOutputStream(String name) { this.name = name; } public void close() throws IOException { try { MemFileSystemAdaptor.fileSystem.writeFile(name, bStream.toByteArray()); } catch(RemoteException e) {throw new IOException(e.toString());} } public void write(byte[] b) {bStream.write(b, 0, b.length);} public void write(byte[] b, int start, int len) {bStream.write(b, start, len);} public void write(int i) {bStream.write(i);} }
http://stackoverflow.com/questions/5629116/simple-in-memory-file-system
http://www.flipcode.com/archives/Programming_a_Virtual_File_System-Part_I.shtml
Java code: https://github.com/marschall/memoryfilesystem
Read full article from Design an in-memory file system | Runhe Tian Coding Practice