⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directory.cc

📁 nachos系统作业 实现线程系统 实现一个电梯模拟 附实验报告
💻 CC
字号:
// directory.cc //	Routines to manage a directory of file names.////	The directory is a table of fixed length entries; each//	entry represents a single file, and contains the file name,//	and the location of the file header on disk.  The fixed size//	of each directory entry means that we have the restriction//	of a fixed maximum size for file names.////	The constructor initializes an empty directory of a certain size;//	we use ReadFrom/WriteBack to fetch the contents of the directory//	from disk, and to write back any modifications back to disk.////	Also, this implementation has the restriction that the size//	of the directory cannot expand.  In other words, once all the//	entries in the directory are used, no more files can be created.//	Fixing this is one of the parts to the assignment.//// Copyright (c) 1992-1993 The Regents of the University of California.// All rights reserved.  See copyright.h for copyright notice and limitation // of liability and disclaimer of warranty provisions.#include "copyright.h"#include "utility.h"#include "filehdr.h"#include "directory.h"//----------------------------------------------------------------------// Directory::Directory// 	Initialize a directory; initially, the directory is completely//	empty.  If the disk is being formatted, an empty directory//	is all we need, but otherwise, we need to call FetchFrom in order//	to initialize it from disk.////	"size" is the number of entries in the directory//----------------------------------------------------------------------Directory::Directory(int size){    table = new DirectoryEntry[size];    tableSize = size;    for (int i = 0; i < tableSize; i++)	table[i].inUse = FALSE;}//----------------------------------------------------------------------// Directory::~Directory// 	De-allocate directory data structure.//----------------------------------------------------------------------Directory::~Directory(){     delete [] table;} //----------------------------------------------------------------------// Directory::FetchFrom// 	Read the contents of the directory from disk.////	"file" -- file containing the directory contents//----------------------------------------------------------------------voidDirectory::FetchFrom(OpenFile *file){    (void) file->ReadAt((char *)table, tableSize * sizeof(DirectoryEntry), 0);}//----------------------------------------------------------------------// Directory::WriteBack// 	Write any modifications to the directory back to disk////	"file" -- file to contain the new directory contents//----------------------------------------------------------------------voidDirectory::WriteBack(OpenFile *file){    (void) file->WriteAt((char *)table, tableSize * sizeof(DirectoryEntry), 0);}//----------------------------------------------------------------------// Directory::FindIndex// 	Look up file name in directory, and return its location in the table of//	directory entries.  Return -1 if the name isn't in the directory.////	"name" -- the file name to look up//----------------------------------------------------------------------intDirectory::FindIndex(char *name){    for (int i = 0; i < tableSize; i++)        if (table[i].inUse && !strncmp(table[i].name, name, FileNameMaxLen))	    return i;    return -1;		// name not in directory}//----------------------------------------------------------------------// Directory::Find// 	Look up file name in directory, and return the disk sector number//	where the file's header is stored. Return -1 if the name isn't //	in the directory.////	"name" -- the file name to look up//----------------------------------------------------------------------intDirectory::Find(char *name){    int i = FindIndex(name);    if (i != -1)	return table[i].sector;    return -1;}//----------------------------------------------------------------------// Directory::Add// 	Add a file into the directory.  Return TRUE if successful;//	return FALSE if the file name is already in the directory, or if//	the directory is completely full, and has no more space for//	additional file names.////	"name" -- the name of the file being added//	"newSector" -- the disk sector containing the added file's header//----------------------------------------------------------------------boolDirectory::Add(char *name, int newSector){     if (FindIndex(name) != -1)	return FALSE;    for (int i = 0; i < tableSize; i++)        if (!table[i].inUse) {            table[i].inUse = TRUE;            strncpy(table[i].name, name, FileNameMaxLen);             table[i].sector = newSector;        return TRUE;	}    return FALSE;	// no space.  Fix when we have extensible files.}//----------------------------------------------------------------------// Directory::Remove// 	Remove a file name from the directory.  Return TRUE if successful;//	return FALSE if the file isn't in the directory. ////	"name" -- the file name to be removed//----------------------------------------------------------------------boolDirectory::Remove(char *name){     int i = FindIndex(name);    if (i == -1)	return FALSE; 		// name not in directory    table[i].inUse = FALSE;    return TRUE;	}//----------------------------------------------------------------------// Directory::List// 	List all the file names in the directory. //----------------------------------------------------------------------voidDirectory::List(){   for (int i = 0; i < tableSize; i++)	if (table[i].inUse)	    printf("%s\n", table[i].name);}//----------------------------------------------------------------------// Directory::Print// 	List all the file names in the directory, their FileHeader locations,//	and the contents of each file.  For debugging.//----------------------------------------------------------------------voidDirectory::Print(){     FileHeader *hdr = new FileHeader;    printf("Directory contents:\n");    for (int i = 0; i < tableSize; i++)	if (table[i].inUse) {	    printf("Name: %s, Sector: %d\n", table[i].name, table[i].sector);	    hdr->FetchFrom(table[i].sector);	    hdr->Print();	}    printf("\n");    delete hdr;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -