搜档网
当前位置:搜档网 › 实验3 文件管理

实验3 文件管理

实验3  文件管理
实验3  文件管理

实验三文件管理

一、实验目的

理解文件系统的主要概念及文件系统内部功能和实现过程。

二、实验内容

采用二级文件目录结构,编写程序实现文件系统的文件存储空间的管理、文件的物理结构、目录结构管理和文件操作。具体如下:

1、设计一个有m个用户的文件系统,每个用户最少可保存一个文件。

2、规定用户在一次运行中只能打开K个文件。

3、系统能检查键入命令的正确性,出错时应能显示出错原因。

4、对文件应能设置保护措施,如只能执行、允许读、允许写等。

5、对文件的操作设计提供一套文件操作:

CREATE建立文件;

DELETE删除文件;

OPEN打开文件;

CLOSE关闭文件;

READ读文件;

WRITE写文件。

三、实验要求

①详细描述实验设计细想、程序结构及各模块设计思路。

②详细描述程序所用数据结构及算法

③给出测试用例及实验结构

④为增加程序可读性,在程序中进行适当注释说明

⑤认真进行实验总结,包括:设计中遇到的问题、解决方法和收获

⑥实验报告撰写要求结构清晰、描述准确逻辑性强

四、实验过程

举例:主文件目录

mfd=record

username :string[maxlen];

files :array[1..K] of ufd;

ofiles :arrau[1..S] of uod

end;

用户打开文件目录表:

uod=record

filename:string[maxlen];

attrib:attrib;

status:(open,create);

rp,up:integer;

end;

用户文件目录:

ufd=record

fielname:string[maxlen];

attrib ro,rw);

len:integer;

addr:integer;

end;

流程图:

二、主要数据结构

界面采用VC6 MFC环境开发

#define MAXUSER 10 //假想文件系统最多支持的人数

#define BLOCKSIZE 32 //虚拟磁盘中物理块为每块32字节

#define DISKSIZE BLOCKSIZE*1000 //虚拟磁盘容量为1000*32=32K

struct UFD //说明文件项的结构数组

{

char FileName[15];

char Time[16]; //文件建立或修改时间如2003/5/6 12:00

bool IsExist; //文件是否存在,删除时标为0

bool IsShared; //共享标记,共享文件可被其它用户所访问

bool AttrRead; //文件是否可读

bool AttrWrite; //文件是否可写

bool AttrExecute; //文件是否可执行

HTREEITEM treeNode; //用于树控件显示的结点句柄

USHORT FileLen; //文件占用字节数

USHORT BlockNum; //文件占用的物理块数

USHORT FileLink[100];//文件物理块地址数组,每块32字节,限定一个文件最大100*32=3200字节

};

struct MFD

{

char UserName[10]; //主目录用户名

bool IsExist; //该用户否存在

UFD ufd[MAXFILE]; //用户文件数组

USHORT nItem;//UFD个数

};

struct HEADBLOCK

{

BYTE pStack; //堆栈指针

SHORT pBlock[10]; //块号 pBlock[10]是下一个盘块号逻辑地址

};

struct BLOCK //虚拟磁盘的物理块数据结构

{

union{

BYTE block[32]; //一块为32字节

HEADBLOCK HeadInfo;

};

};

struct FAT

{

BLOCK SuperBlock; //超级块,指示第一个空闲块逻辑号

USHORT MaxOpen; //该用户同时可打开的最大文件数

USHORT UserNum; //最户数

MFD Mfd[MAXUSER]; //最多可支持10个用户

};

//空闲块成组链接法

bool OpenList[MAXUSER][MAXFILE]; //描述文件是否打开的布尔型数组

FAT FileFAT; //描述文件记录项的FAT结构

CFile FATIO; //负责和VDISK.DAT打交道的文件句柄

CString CurrentUser; //当前登录的用户名

说明:本实验采用模拟文件结构的方法,把记录用户帐号,用户文件和磁盘块的信息用当前目录下的VDISK.DAT来记录,可以把VDISK.DAT看成是一个虚拟的磁盘,其头部是FAT结构,用来记录各个用户和文件信息,紧接着是空闲块成组链接法的数据结构,每块32字节,每组10块,共1000块,也就是说,用户文件数据的总容量是32*1000字节,如果程序当前目录下找不到用于做实验用的VDISK.DAT,在登录时程序会提示是否“格式化虚拟磁盘”也就是新建一个VDISK.DAT文件,接着,程序会显示“用户管理”的窗口,此时应新建几个帐号用于登录做实验。

登录后,程序会显示该用户的所有文件,右方的文件列表会显示每个文件的属性信息,和WINDOWS的“资源管理器”相似。用鼠标双击列表的每个文件就可以查看文件的内容。单击“新建文件”按钮可以创建一个新的用户文件。

选中某个文件后,就可以进行相应的操作,如“修改文件”、“删除文件”或是“打开文件”,删除某个文件时检查该文件的属性,如果是只读的,就是显示警告窗口让用户确认是否一定要删除。

硬盘工具可以用图形方式显示“磁盘”块的详细情况,空白块说明该块没有使用,暗红色的说明块已分配,窗口还统计占用的空间大小、用户数等信息。

程序中用到的结构图如下图所示:

MFD

三、主要算法与部分代码

void CDlgUser::OnAddUser()

{

UpdateData(true);

if (https://www.sodocs.net/doc/1015853140.html,erNum>=10)

{

AfxMessageBox("用户数量已达到最大10个,你可以删除一些无用的帐号!");

return;

}

for(int i=0;i<10;i++)

{

if(FileFAT.Mfd[i].IsExist==false)

{

wsprintf(FileFAT.Mfd[i].UserName,m_UserName);

FileFAT.Mfd[i].IsExist=true;

FileFAT.Mfd[i].nItem=0;

break;

}

https://www.sodocs.net/doc/1015853140.html,erNum++;

WriteFAT();

ReadFAT();

ShowUser();//显示现有的用户列表

m_UserName.Empty();

UpdateData(false);

}

bool ReadBlock(int id, BLOCK* buffer) //读指定块号内容(32字节)到buffer所指向的单元

{

if(!FATIO) return false; //如果虚拟磁盘文件句柄为空,出错返回

if(!FATIO.Seek(sizeof(FAT)+(id-1)*BLOCKSIZE,CFile::begin)) return false;//移动文件指针到指定块号if(FATIO.Read(buffer,BLOCKSIZE)!=BLOCKSIZE) return false;//读该块的内容到buffer指定的单元

return true;

}

bool WriteBlock(int id, BLOCK* buffer) //把buffer所指向的单元的内容(32字节)写到指定的物理块中

{

if(!FATIO) return false;

if(!FATIO.Seek(sizeof(FAT)+(id-1)*BLOCKSIZE,CFile::begin)) return false;

FATIO.Write(buffer,BLOCKSIZE);

return true;

}

USHORT AllocBlock() //分配一物理块,成功返回逻辑块号,失败返回0;

{

if(!FileFAT.SuperBlock.HeadInfo.pBlock[FileFAT.SuperBlock.HeadInfo.pStack]) return 0;

//没有空间可分配,失败返回

if(FileFAT.SuperBlock.HeadInfo.pStack<9)//如果一组的空闲块没有分配完

{

WriteFAT();

//将返回超级块所指的空闲块,再将堆栈指针加一

return FileFAT.SuperBlock.HeadInfo.pBlock[FileFAT.SuperBlock.HeadInfo.pStack++];

}

else //如果分配的空闲块是组头

{

WriteFAT();

USHORT returnBlock=FileFAT.SuperBlock.HeadInfo.pBlock[9];

//将要分配的组头复制到超级块,再返回组头作为空闲块

if(!ReadBlock(returnBlock,&FileFAT.SuperBlock)) return 0;

return returnBlock;

}

WriteFAT();

return 0;

}

bool FreeBlock(USHORT BlockID) //回收一物理块,成功返回TRUE,失败返回FALSE

{

if(FileFAT.SuperBlock.HeadInfo.pStack>0)//如果该组的空闲没有回收满

{

//堆栈指针退一,把回收的块号记入超级块

FileFAT.SuperBlock.HeadInfo.pBlock[--FileFAT.SuperBlock.HeadInfo.pStack]=BlockID;

BLOCK newBlock;

if (!WriteBlock(BlockID,&newBlock)) return false;

}

else//如果该组已回收满,需要加入一新组的话

{

if (!WriteBlock(BlockID,&FileFAT.SuperBlock)) return false;//将超级块的栈内容复制到要回收的块中 FileFAT.SuperBlock.HeadInfo.pStack=9;//将超级块的栈指针指向回收的块

FileFAT.SuperBlock.HeadInfo.pBlock[9]=BlockID;

}

WriteFAT();

return true;

}

bool ReadFAT() //从虚拟磁盘中读取FAT结构信息到FileFAT中

{

ZeroMemory(&FileFAT,sizeof(FileFAT));

FATIO.SeekToBegin();

if (!FATIO.Read(&FileFAT,sizeof(FileFAT))) return false;

return true;

}

bool Format()//格式化虚拟磁盘,创建VDISK.DAT,所有用户和文件信息将被清空!

{

CString FATFile;

int i;

char fname[128];

GetCurrentDirectory(128,fname); //FAT表信息保存在当前目录的VDISK.DAT中

FATFile.Format("%s",fname);

if (FATFile.Right(1)!="\\")

FATFile+="\\VDISK.DAT";

else

FATFile+="VDISK.DAT";

CFile fout;

if( !fout.Open(FATFile,CFile::modeCreate|CFile::modeWrite,NULL))

return false;

ZeroMemory(&FileFAT,sizeof(FileFAT));

FileFAT.SuperBlock.HeadInfo.pStack=0;

for(i=0;i<10;i++)

{

FileFAT.SuperBlock.HeadInfo.pBlock[i]=i+1;

}

fout.WriteHuge(&FileFAT,sizeof(FileFAT));

BYTE *Buffer;

Buffer=(BYTE*)malloc(DISKSIZE);//申请成组链接法所需的磁盘块空间

ZeroMemory(Buffer,DISKSIZE);

BLOCK newBlock;

for (i=10;i<=990;i+=10)

{

ZeroMemory(&newBlock,sizeof(newBlock));

newBlock.HeadInfo.pStack=0;

for (int k=0;k<10;k++)

memcpy(Buffer+32*(i-1),&newBlock,32);

}

fout.WriteHuge(Buffer,DISKSIZE); //将格式化的块信息写入VDISK.DAT

free(Buffer);

fout.Close();

AfxMessageBox("创建虚拟磁盘文件成功!请选择用户管理添加新用户。");

return true;

}

//StartIO()用于完成与虚拟磁盘的IO的初始化工作

void StartIO()//打开VDISK.DAT文件,把该文件句柄保存在全局变量中,如果该文件不存在,创建并初始化该文件。{

CString FATFile;

char fname[128];

GetCurrentDirectory(128,fname); //FAT表信息保存在当前目录的VDISK.DAT中

FATFile.Format("%s",fname);

if (FATFile.Right(1)!="\\")

FATFile+="\\VDISK.DAT";

else

FATFile+="VDISK.DAT";

bFormated=true;

if (!FileExist(FATFile))

{

AfxMessageBox("当前目录下找不到VDISK.DAT,该文件是用来模拟磁盘及文件管理表。\n单击确定创建新的虚拟磁盘文件!");

bFormated=false;

if (!Format())

{

AfxMessageBox("创建文件系统出错!");

return;

}

}

if(!FATIO.Open(FATFile,CFile::modeReadWrite|CFile::shareDenyWrite,NULL))

{

AfxMessageBox("调入FAT表失败,文件系统可能出错!");

bFormated=false;

return;

}

}

bool CreateNewFile(CString FileName, CString FileContent, bool AttrRead, bool AttrWrite, bool AttrExecute, bool AttrShare)//创建一个新文件

{

if (FileNameExist(FileName)) return false; //如果要建立的文件与现有文件重名,失败返回int i,FilePos,FileLen,BlockNum,BlockID;

bool flag=false;

FileContent.TrimLeft();FileContent.TrimRight();

FileLen=FileContent.GetLength();

char Content[32];//把文件内容分割成每个物理块大小后送content字符数组,以备写入磁盘块中

for(i=0;i

{

{

flag=true;FilePos=i;

break;

}

}

if(!flag) return false;

BlockNum=(int)FileLen/BLOCKSIZE+1;//计算文件占用的块数

for(i=0;i

{

BlockID=AllocBlock();//得到分配的块的逻辑号

if(BlockID)

{

FileFAT.Mfd[CurrentID].ufd[FilePos].FileLink[i]=BlockID;//逐个将块号记入文件项中

wsprintf(Content,FileContent.Mid(i*32,32));//写入一个块的内容到缓冲区

if(!WriteBlock(BlockID,(BLOCK*)Content)) return false;//从缓冲区写到虚拟磁盘 }

else

{

return false;

}

}

//以下是填写文件的属性,时间等信息

wsprintf(FileFAT.Mfd[CurrentID].ufd[FilePos].FileName,FileName.Left(15));

FileFAT.Mfd[CurrentID].ufd[FilePos].IsExist=true;

FileFAT.Mfd[CurrentID].ufd[FilePos].BlockNum=BlockNum;

FileFAT.Mfd[CurrentID].ufd[FilePos].AttrExecute=AttrExecute;

FileFAT.Mfd[CurrentID].ufd[FilePos].AttrRead=AttrRead;

FileFAT.Mfd[CurrentID].ufd[FilePos].AttrWrite=AttrWrite;

FileFAT.Mfd[CurrentID].ufd[FilePos].IsShared=AttrShare;

FileFAT.Mfd[CurrentID].ufd[FilePos].FileLen=FileContent.GetLength();

wsprintf(FileFAT.Mfd[CurrentID].ufd[FilePos].Time,GetCurrentTime());

FileFAT.Mfd[CurrentID].nItem++;

WriteFAT();

ShowUserFiles();//刷新用户文件列表,以便将新建的文件显示出来

return true;

}

CString ReadFile(CString FileName) //给定当前用户的文件名,将文件内容以Cstring字符串返回

{

int i,FilePos;

bool flag=false;

char Buffer[32];

CString strReturn;

for(i=0;i

{

if(FileFAT.Mfd[CurrentID].ufd[i].FileName==FileName&&FileFAT.Mfd[CurrentID].ufd[i].IsExist==tr ue)

{

flag=true;FilePos=i;break;

}

if(!flag) return "";

for(i=0;i

{

ZeroMemory(Buffer,32);

if(!ReadBlock(FileFAT.Mfd[CurrentID].ufd[FilePos].FileLink[i],(BLOCK*)Buffer)) return "";

strReturn+=Buffer;

}

return strReturn;

}

bool KillFile(CString FileName)//根据文件名删除用户当前文件

{

int i,FilePos;

bool flag=false;

for(i=0;i

{

if(FileFAT.Mfd[CurrentID].ufd[i].FileName==FileName&&FileFAT.Mfd[CurrentID].ufd[i].IsExist==true) {

flag=true; FilePos=i; break;

}

}

if(!flag) return false;

for(i=0;i

if(!FreeBlock(FileFAT.Mfd[CurrentID].ufd[FilePos].FileLink[i])) return false;

FileFAT.Mfd[CurrentID].nItem--;

ZeroMemory(&FileFAT.Mfd[CurrentID].ufd[FilePos],sizeof(UFD));

WriteFAT();

return true;

}

bool ModifyFile(CString FileName, CString FileContent, bool AttrRead, bool AttrWrite, bool AttrExecute, bool AttrShare) //修改文件,包括文件名、属性和内容

{

int i,FilePos,BlockNum,BlockID;

bool flag=false;

FileContent.TrimLeft();

FileContent.TrimRight();

char Content[32];

for(i=0;i

{

if(FileFAT.Mfd[CurrentID].ufd[i].FileName==SelectedFileName)

{

flag=true; FilePos=i;break;

}

}

if(!flag) return false;

for(i=0;i

{

if(!FreeBlock(FileFAT.Mfd[CurrentID].ufd[FilePos].FileLink[i])) return false;

ZeroMemory(&FileFAT.Mfd[CurrentID].ufd[FilePos].BlockNum,200);

BlockNum=(int)FileContent.GetLength()/BLOCKSIZE+1;

for(i=0;i

{

BlockID=AllocBlock();

if(BlockID)

{

FileFAT.Mfd[CurrentID].ufd[FilePos].FileLink[i]=BlockID;

wsprintf(Content,FileContent.Mid(i*32,32));

if(!WriteBlock(BlockID,(BLOCK*)Content)) return false;

}

else

{

return false;

}

}

wsprintf(FileFAT.Mfd[CurrentID].ufd[FilePos].FileName,FileName.Left(15));

FileFAT.Mfd[CurrentID].ufd[FilePos].IsExist=true;

FileFAT.Mfd[CurrentID].ufd[FilePos].BlockNum=BlockNum;

FileFAT.Mfd[CurrentID].ufd[FilePos].AttrExecute=AttrExecute;

FileFAT.Mfd[CurrentID].ufd[FilePos].AttrRead=AttrRead;

FileFAT.Mfd[CurrentID].ufd[FilePos].AttrWrite=AttrWrite;

FileFAT.Mfd[CurrentID].ufd[FilePos].IsShared=AttrShare;

FileFAT.Mfd[CurrentID].ufd[FilePos].FileLen=FileContent.GetLength();

wsprintf(FileFAT.Mfd[CurrentID].ufd[FilePos].Time,GetCurrentTime());

WriteFAT();

ShowUserFiles();

return true;

}

void CDlgDisk::CalcBlock()// “磁盘工具”中的计算并显示磁盘块使用情况功能

{

BYTE DiskImage[32000];//磁盘数据区所有物理块映像数组

FATIO.Seek(sizeof(FileFAT),CFile::begin);//跳过FAT结构,定位文件指针至数据区物理块头 FATIO.Read(&DiskImage,32000);//读物理块映像

register sum=0;//保存使用的总块数

for(int i=0;i

{

m_ctrlChecker.SetBlock(FileFAT.SuperBlock.HeadInfo.pBlock[i]-1, RGB(200, 0, 0));

sum++;

}

BLOCK testBlock;

memcpy(&testBlock,&DiskImage[FileFAT.SuperBlock.HeadInfo.pBlock[9]*32],BLOCKSIZE);

while(testBlock.HeadInfo.pBlock[9]>0)

{

for(i=0;i<10;i++)

{

m_ctrlChecker.SetBlock(testBlock.HeadInfo.pBlock[i]-1, RGB(200,0,0));

sum++;

memcpy(&testBlock,&DiskImage[testBlock.HeadInfo.pBlock[9]*32],BLOCKSIZE);

}

AddPiece(RGB(200,0,0),(int)sum*360/100,"Used");

m_Used.Format("已用空间:%d 字节",sum*32);

m_UserNum.Format("用户数:%d",https://www.sodocs.net/doc/1015853140.html,erNum);

UpdateData(false);

}

实验 文件管理(二)

实验六:文件系统 一、目的要求 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 2、要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二、例题: ①设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 ②程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 ③为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 ④算法与框图: a、因系统小,文件目录的检索使用了简单的线性搜索。 b、文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。 c、程序中使用的主要设计结构如下: Ⅰ、主文件目录和用户文件目录(MFD、UFD) Ⅱ、打开文件目录(AFD)(即运行文件目录)

三、调度算法的流程图 四、文件管理源程序 #include<> #include<> #include<> #include<> typedef struct ufd { char filename[10];/*文件名*/ char procode[8];/*属性*/

int length;/*文件长度*/ struct ufd *nextfile;/*指向下一个文件*/ }UFD; typedef struct mfd { char username[10];/*用户名*/ struct ufd *link;/*指向该用户的第一个文件*/ }MFD; typedef struct protected_flag { char code[4]; }PRO; typedef struct afd/*运行文件目录*/ { char filename[10];/*打开文件名*/ char procode[4]; int rwpointer;/*读写指针*/ }AFD; PRO flag[3]={"100",/*只读*/ "110",/*读写*/ "001"/*可执行*/ }; UFD *rw_pointer;/*读写指针*/ AFD *afd=NULL; MFD filesystem[10]; int num;/*当前用户个数*/ void displayallfile() { int i; UFD *p; for(i=0;ifilename); printf("文件属性: %s\t||",p->procode); printf("文件长度: %d\n\n",p->length); p=p->nextfile; } }

操作系统文件管理实验报告

操作系统实验报告实验名称:文件管理 专业班级:网络工程1301 学号: 姓名: 2015 年6 月16 日

实验一文件管理 一、实验目的 文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、预备知识 1.VS2010的使用 2.C#的学习 3.文件主目录与子目录的理解 三、实验容与步骤 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10 个用户的文件系统,每次用户可保存10 个文件,一次运行用户可以打开5 个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write 等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 程序流程图:

逻辑设计: 使用线性数组表表示MFD,泛型数组表示UFD,每个元素包括用户ID、保存的文件数、再使用线性表表示文件信息,每个元素包括文件名,文件属性(保护码),文件的状态等信息。 物理设计: //主目录 private FileUser[] mfd; //当前用户 private FileUser currentuser; ///

/// 文件 /// public class FileObject { public string filename; public int size=20; public int read=0; public int write = 0; public string author; } /// /// 文件系统用户 /// public class FileUser { public string username;

操作系统课程设计文件系统管理)

操作系统课程设计Array文件系统管理 学院计算机学院 专业计算机科学与技术 班级 姓名 学号 2013年1月8日 广东工业大学计算机学院制 文件系统管理 一、实验目的 模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。 二、实验内容和要求 编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。在用户程序中通过使用文件系统提供的create,open,read,write,close,delete等文件命令,对文件进行操作。 以下报告主要包括: 1.可行性分析 2.需求分析 3.概要设计

4.详细设计 5.测试 6.总结 三、可行性分析 1、技术可行性 对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。利用大二期间学习的数据结构可以模拟出此课程设计的要求。 2、经济可行性 课程设计作为本课程的练习及进一步加深理解。与经济无关,可以不考虑。(零花费,零收益) 3.法律可行性 自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。 四、需求分析 编写程序实现文件系统,主要有以下几点要求: 1、实现无穷级目录管理及文件管理基本操作 2、实现共享“别名” 3、加快了文件检索 五、概要设计 为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD(User File Directory)。这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。此外,在系统中再建立一个主文件目录MFD (Master File Directory);在主文件目录中,每个用户目录文件都占有一个目

操作系统实验5文件系统:Linux文件管理

实验5 文件系统:Linux文件管理 1.实验目的 (1)掌握Linux提供的文件系统调用的使用方法; (2)熟悉文件和目录操作的系统调用用户接口; (3)了解操作系统文件系统的工作原理和工作方式。 2.实验内容 (1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:*********** 0. 退出 1. 创建新文件 2. 写文件 3. 读文件 4. 复制文件 5. 修改文件权限 6. 查看文件权限 7. 创建子目录 8. 删除子目录 9. 改变当前目录到指定目录 10. 链接操作 *********** 代码: #include #include #include #include #include #include #include #include void menu(void); void openfile(void); void writefile(void); void readfile(void); void copyfile(void); void chmd(void); void ckqx(void); void cjml(void); void scml(void); void ggml(void); void ylj(void); int main() { int choose; int suliangjin=1;

menu(); scanf("%d",&choose); while(choose!=0) { switch(choose) { case 1:openfile();break; case 2:writefile();break; case 3:readfile();break; case 4:copyfile();break; case 5:chmd();break; case 6:ckqx();break; case 7:cjml();break; case 8:scml();break; case 9:ggml();break; case 10:ylj();break; } menu(); scanf("%d",&choose); } return 0; } void menu(void) { printf("文件系统\n"); printf("1.创建新文件\n"); printf("2.写文件\n"); printf("3.读文件\n"); printf("4.复制文件\n"); printf("5.修改文件权限\n"); printf("6.查看文件权限\n"); printf("7.创建子目录\n"); printf("8.删除子目录\n"); printf("9.改变目前目录到指定目录\n"); printf("10.链接操作\n"); printf("0.退出\n"); printf("请输入您的选择...\n"); } void openfile(void) { int fd; if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");

3-实验三-表空间及数据文件管理

实验三表空间及数据库文件管理 实验报告 姓名:班级:学号: 一、实验目的 1)理解Oracle数据库的体系结构 2)掌握表空间的概念及其管理方法 3)掌握数据文件的作用及其管理 4)掌握控制文件的作用及其管理 5)掌握重做日志文件的工作方式及其管理 6)掌握数据库归档模式设置及归档管理 二、预习内容(参考教材第5章、第6章的内容) 1)什么是Oracle数据库的物理结构,具体包括哪几类文件? 2)什么是Oracle数据库的逻辑结构,如何表现? 3)数据库、表空间、数据文件、数据库对象之间的关系如何? 三、实验环境 32位Windows XP/Windows Server2000/Windows Server2003 +Oracle10g环境 四、实验内容 1)在SQL*PLUS环境下,使用SQL命令创建一个本地管理方式下自动分区管理的表空间USERTBS1,其对应的数据文件为usertbs1_1.DBF,大小为20MB。 2)使用SQL命令创建一个本地管理方式下自动分区管理的表空间USERTBS2,要求每个分区大小为512KB。 3)修改USERTBS1表空间的大小为30MB,将其数据文件改为自动扩展方式,每次扩展5MB,最大值为100MB。 4)使用SQL命令创建一个本地管理方式下的临时表空间TEMPTBS,并将该表空间作为当前数据库实例的默认临时表空间。 5)使用SQL命令对USERTBS1表空间进行联机和脱机状态转换。 6)创建一个回滚表空间UNDOTBS,并作为数据库的撤销表空间。 7)删除表空间USERTBS2,同时删除该表空间的内容以及对应的操作系统文件。 8)为USERS表空间添加一个数据文件users03.DBF,大小为50MB。 9)为EXAMPLE表空间添加一个数据文件,文件名为example02.dbf,大小为20M。 10)将表空间USERS中的数据文件users03.DBF更名为userdata03.dbf,将表空间EXAMPLE中的数据文件example02.dbf更名为example03.dbf。 11)修改USER表空间的userdata03为自动扩展方式,每次扩展5MB,最大为100MB。 12)查询当前数据库中所有表空间及其对应的数据文件信息。 13)将数据库的控制文件以二进制文件的形式备份。 14)为数据库ORCL添加一个重做日志文件组,组内包含两个成员文件,分别为redo4a.log和redo4b.log,大小分别为5MB。 15)为新建的重做日志文件组添加一个成员完文件,名称为redo4c.log。 16)将数据库设置为归档模式,并采用自动归档方式。 17)设置数据库归档路径为D:\ORACLE\BACKUP。

实验三 文件系统实验

实验三文件系统实验 一.目的要求 1. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 2. 要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二.例题: ●设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行 用户可以打开5个文件。 ●程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。 另外,为打开文件设置了运行文件目录(AFD)。 ●为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读 写指针,并不进行实际的读写操作 ●算法与框图: 1.因系统小,文件目录的检索使用了简单的线性搜索。 2.文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位 为0,则表示不允许读写、执行。 3.程序中使用的主要设计结构如下: ●主文件目录和用户文件目录(MFD、UFD) ●打开文件目录(AFD)(即运行文件目录) MDF: (1)用户名 (2)文件目录指针 (3)用户名 (4)文件目录指针 UFD (1)文件名

(2)保护码 (3)文件长度 (4)文件名 AFD (1)打开文件名 (2)打开保护码 (3)读写指针 文件系统算法的流程图如下:

三.实验题: 1.增加2~3个文件操作命令,并加以实现。(如移动读写指针,改变文件属性, 更换文件名,改变文件保护级别)。 2.编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信 息,不需要打入冗长的命令。 3.设计一个树型目录结构的文件系统,其根目录为root,各分支可以是目录, 也可以是文件,最后的叶子都是文件。 4.根据学校各级机构,编制一文件系统。

操作系统文件管理_答案

第六部分文件管理 1、文件系统的主要目的就是( )。 A、实现对文件的按名存取 B、实现虚拟存储 C、提供外存的读写速度 D、用于存储系统文件 2、文件系统就是指( )。 A、文件的集合 B、文件的目录集合 C、实现文件管理的一组软件 D、文件、管理文件的软件及数据结构的总体 3、文件管理实际上就是管理( )。 A、主存空间 B、辅助存储空间 C、逻辑地址空间 D、物理地址空间 4、下列文件的物理结构中,不利于文件长度动态增长的文件物理结构就是( )。 A、顺序文件 B、链接文件 C、索引文件 D、系统文件 5、下列描述不就是文件系统功能的就是( )。 A、建立文件目录 B、提供一组文件操作 C、实现对磁盘的驱动调度 D、实现从逻辑文件到物理文件间的转换 6、文件系统在创建一个文件时,为它建立一个( )。 A、文件目录 B、目录文件 C、逻辑结构 D、逻辑空间 7、索引式(随机)文件组织的一个主要优点就是( )。 A、不需要链接指针 B、能实现物理块的动态分配 C、回收实现比较简单 D、用户存取方便 8、面向用户的文件组织机构属于( )。 A、虚拟结构 B、实际结构 C、逻辑结构 D、物理结构 9、按文件用途来分,编译程序就是( )。 A、用户文件 B、档案文件 C、系统文件 D、库文件 10、将信息加工形成具有保留价值的文件就是( )。 A、库文件 B、档案文件 C、系统文件 D、临时文件 11、文件目录的主要作用就是( )。 A、按名存取 B、提高速度 C、节省空间 D、提高外存利用率 12、如果文件系统中有两个文件重名,不应采用( )。 A、一级目录结构 B、树型目录结构 C、二级目录结构 D、A与C 13、文件系统采用树型目录结构后,对于不同用户的文件,其文件名( )。 A、应该相同 B、应该不同 C、可以不同,也可以相同 D、受系统约束 14、文件系统采用二级文件目录可以( )。 A、缩短访问存储器的时间 B、实现文件共享 C、节省内存空间 D、解决不同用户间的文件命名冲突

操作系统实验文件管理C 代码

#include #include #include #include #include using namespace std; #define BLKSIZE 512 // 数据块的大小 #define BLKNUM 512 // 数据块的块数 #define INODESIZE 32 // i节点的大小 #define INODENUM 32 // i节点的数目 #define FILENUM 8 // 打开文件表的数目//用户 typedef struct { char user_name[10]; // 用户名 char password[10]; // 密码 } User; //i节点 typedef struct { short inum; // 文件i节点号 char file_name[10]; // 文件名

char type; // 文件类型 char user_name[10]; // 文件所有者 short iparent; // 父目录的i节点号 short length; // 文件长度 short address[2]; // 存放文件的地址 } Inode; //打开文件表 typedef struct { short inum; // i节点号 char file_name[10]; // 文件名 short mode; // 读写模式(1:read, 2:write, // 3:read and write) } File_table; // 申明函数 void login(void); void init(void); int analyse(char *); void save_inode(int); int get_blknum(void); void read_blk(int); void write_blk(int);

实验五 文件管理

课程名称:操作系统 课程类型:必修 实验项目名称:文件管理 实验题目:设计一个多用户的文件系统 一、实验目的 随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、实验要求及实验环境 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10 个用户的文件系统,每次用户可保存10 个文件,一次运行用户可以打开5 个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write 等命令。所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系) 1.程序流程图

2.逻辑设计 使用线性表表示UFD,每个元素包括用户ID、保存的文件数、再使用线性表表示文件信息,每个元素包括文件名,文件属性(保护码),文件的状态等信息。该结构需支持以下操作:在尾部插入,查找,修改,在任意位置删除。3、物理设计 char UserName[SizeOfUser][SizeOfUserName];//用户ID long User;//当前用户标志 struct InfoOfFile { char Name[SizeOfFileName];//文件名 bool safe[3];//Read,Write,Execute long status;//ready,open; }UFD[SizeOfUser][SizeOfFile];

计算机操作系统实验-文件管理

哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:操作系统 课程类型:必修 实验项目名称:文件管理 实验题目:设计一个多用户的文件系统 班级:实验学院一班 学号:6040310110 姓名:张元竞 设计成绩报告成绩指导老师

一、实验目的 随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、实验要求及实验环境 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)

实验八,文件管理

实验八文件管理 一、实验目的: 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 二、实验要求: 要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 三、实验内容: 设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作算法与框图。因系统小,文件目录的检索使用了简单的线性搜索。 文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。 四、运行结果:

五、心得体会: 通过这次试验我学会了如何创建一个用户,已经在此用户下保存多个文件,同时也学会了如何为文件设置保护措施,只允许单个用户访问。这些综合性的知识都在本实验中得到了很好的运用,因此我对文件的管理也得到了一定的锻炼。 六、附录: #include #include #include #include struct user {char name[10]; }user[10]; int in=0; struct link { struct file { char name[10];

实验3 文件管理

实验三文件管理 一、实验目的 理解文件系统的主要概念及文件系统内部功能和实现过程。 二、实验内容 采用二级文件目录结构,编写程序实现文件系统的文件存储空间的管理、文件的物理结构、目录结构管理和文件操作。具体如下: 1、设计一个有m个用户的文件系统,每个用户最少可保存一个文件。 2、规定用户在一次运行中只能打开K个文件。 3、系统能检查键入命令的正确性,出错时应能显示出错原因。 4、对文件应能设置保护措施,如只能执行、允许读、允许写等。 5、对文件的操作设计提供一套文件操作: CREATE建立文件; DELETE删除文件; OPEN打开文件; CLOSE关闭文件; READ读文件; WRITE写文件。 三、实验要求 ①详细描述实验设计细想、程序结构及各模块设计思路。 ②详细描述程序所用数据结构及算法 ③给出测试用例及实验结构 ④为增加程序可读性,在程序中进行适当注释说明 ⑤认真进行实验总结,包括:设计中遇到的问题、解决方法和收获 ⑥实验报告撰写要求结构清晰、描述准确逻辑性强 四、实验过程 举例:主文件目录 mfd=record username :string[maxlen]; files :array[1..K] of ufd; ofiles :arrau[1..S] of uod end; 用户打开文件目录表: uod=record filename:string[maxlen]; attrib:attrib;

status:(open,create); rp,up:integer; end; 用户文件目录: ufd=record fielname:string[maxlen]; attrib ro,rw); len:integer; addr:integer; end; 流程图: 二、主要数据结构 界面采用VC6 MFC环境开发

兰州大学操作系统实验七存储管理题目和答案

实验七实验报告 实验名称:7 存储管理 实验目的: 1.观察系统存储器使用情况 2.观察进程使用存储器的情况 3.掌握通过内存映像文件提高性能的方法 4.掌握动态内存分配技术 实验时间 3学时 预备知识: 1.存储相关的命令 free 显示系统使用和未被使用的内存数量(可以实时执行) 输出包含的标题有 3 行信息: Mem。此行包含了有关物理内存的信息。包括以下详细内容: total。该项显示可用的物理内存总量,单位为KB。该数字小于安装的物理内存的 容量,是因为内核本身也要使用一小部分的内存。 used。该项显示了用于应用程序超速缓存数据的内存容量。 free。该项显示了此时未使用且有效的内存容量。 Shared/buffers 缓冲区/cached。这些列显示了有关内存如何使用的更为详细的信息。 -/+ buffers/cache。Linux 系统中的部分内存用来为应用程序或设备高速缓存数据。这部分内存在需要用于其他目的时可以释放。 free列显示了调整的缓冲区行,显示释放缓冲区或高速缓存时可以使用的内存容量。 Swap。该行显示有关交换内存利用率的信息。该信息包含全部、已使用和释放的可用内存容量。 vmstat 报告进程、内存、分页、IO等多类信息(使用手册页) size 列出目标文件段大小和总大小(使用手册页)

2./proc文件系统(使用手册页man 5 proc) /proc/meminfo 内存状态信息 /proc/stat 包含内存页、内存对换等信息。 /proc/$pid/stat 某个进程的信息(包含内存使用信息) /proc/$pid/maps某个进程的内存映射区信息,包括地址范围、权限、偏移量以及主次设备号和映射文件的索引节点。 /proc/$pid/statm 某个进程的内存使用信息,包括内存总大小、驻留集大小、共享页面数、文本页面数、堆栈页面数和脏页面数。 3.内存映像文件 内存映像文件是指把一个磁盘文件映像到内存中,二者存在逐字节的对应关系。这样做可以加速I/O操作,并可以共享数据。 3.1 mmap(建立内存映射) 表头文件#include #include 定义函数void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 函数说明mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数start指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回。参数length代表将文件中多大的部分对应到内存。 参数prot代表映射区域的保护方式有下列组合 PROT_EXEC 映射区域可被执行 PROT_READ 映射区域可被读取 PROT_WRITE 映射区域可被写入 PROT_NONE 映射区域不能存取 参数flags会影响映射区域的各种特性 MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不 对地址做修正。通常不鼓励用此旗标。 MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该 文件的进程共享。 MAP_PRIV A TE 对映射区域的写入操作会产生一个映射文件的复制,即私人的

操作系统精髓与设计原理-第12章-文件管理

第12章文件管理 复习题: 12.1、域和记录有什么不同? 答:域(field)是基本数据单位。一个域包含一个值。记录(record)是一组相关的域的集合,它可以看做是应用程序的一个单元。 12.2、文件和数据库有什么不同? 答:文件(file)是一组相似记录的集合,它被用户和应用程序看做是一个实体,并可以通过名字访问。数据库(database)是一组相关的数据集合,它的本质 特征是数据元素间存在着明确的关系,并且可供不同的应用程序使用。 12.3、什么是文件管理系统? 答:文件管理系统是一组系统软件,为使用文件的用户和应用程序提供服务。12.4、选择文件组织时的重要原则是什么? 答:访问快速,易于修改,节约存储空间,维护简单,可靠性。 12.5、列出并简单定义五种文件组织。 答:堆是最简单的文件组织形式。数据按它们到达的顺序被采集,每个记录由一串数据组成。顺序文件是最常用的文件组织形式。在这类文件中,每个记录 都使用一种固定的格式。所有记录都具有相同的长度,并且由相同数目、长度 固定的域按特定的顺序组成。由于每个域的长度和位置已知,因此只需要保存 各个域的值,每个域的域名和长度是该文件结构的属性。索引顺序文件保留 了顺序文件的关键特征:记录按照关键域的顺序组织起来。但它还增加了两个 特征:用于支持随机访问的文件索引和溢出文件。索引提供了快速接近目标记 录的查找能力。溢出文件类似于顺序文件中使用的日志文件,但是溢出文件中 的记录可以根据它前面记录的指针进行定位。索引文件:只能通过索引来访 问记录。其结果是对记录的放置位置不再有限制,只要至少有一个索引的指针 指向这条记录即可。此外,还可以使用长度可变的记录。直接文件或散列 文件:直接文件使用基于关键字的散列。 12.6、为什么在索引顺序文件中查找一个记录的平均搜索时间小于在顺序文件中的平均 搜索时间? 答:在顺序文件中,查找一个记录是按顺序检测每一个记录直到有一个包含符合条件的关键域值的记录被找到。索引顺序文件提供一个执行最小穷举搜索的索引 结构。 12.7、对目录执行的典型操作有哪些? 答:搜索,创建文件,删除文件,显示目录,修改目录。 12.8、路径名和工作目录有什么关系? 答:路径名是由一系列从根目录或主目录向下到各个分支,最后直到该文件的路径 中的目录名和最后到达的文件名组成。工作目录是一个这样的目录,它是含有用 户正在使用的当前目录的树形结构。 12.9、可以授予或拒绝的某个特定用户对某个特定文件的访问权限通常有哪些? 答:无(none),知道(knowledge),执行(execution),读(reading),追加(appending), 更新(updating),改变保护(changing protection),删除(deletion)。 12.10、列出并简单定义三种组块方式。 答:固定组块(fixed blocking):使用固定长度的记录,并且若干条完整的记录被保存在一个块中。在每个块的末尾可能会有一些未使用的空间,称为内部碎片。

操作系统 实验报告 文件管理

昆明理工大学信息工程与自动化学院学生实验报告 (201 —201 学年第二学期) 课程名称:操作系统开课实验室:年月日 一、实验目的 用C或C++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而 对各种文件操作命令的实质内容和执行过程有比较深入的了解。 二、实验原理及基本技术路线图(方框原理图) 用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。 功能设计: Help 显示命令帮助 dir 显示当前目录下的文件和文件夹 exit 退出系统 create [文件名] 创建文本文件 cdir [目录名] 创建文件夹 read [文件名] 读取一个文件最多可同时读取五个 close[文件名] 关闭一个文件 edit [文件名] 编辑一个文件 cd [目录名] 进子目录或者上级目录 attr [文件名] 显示该文件的属性 del [文件名] 删除文件 rename [文件名] 重命名

编辑功能流程图

删除文件流程图创建文件流程图 核心算法: bool Format(void); //格式化 bool install(void); //装载虚拟硬盘的数据 void login(void); /用户登陆

void showMenu(void);//显示功能菜单 bool onAction(void);//用户选择功能并执行 void createFile(string str);//创建文件 bool read(string str);//读取文件 void editFile(string str);//编辑文件 void Delete(string str);//删除一个文件 数据结构: /*---------常变量------*/ const unsigned int BLOCK_SIZE=512; //块长 const unsigned int DATA_BLOCK_NUM=512; //数据块数量 const unsigned int DINODE_START=4*BLOCK_SIZE; //inode起始位置 const unsigned int DINODE_SIZE=512; //inode大小 const unsigned int DINODE_NUM=32; //inode数量 const unsigned int DATASTART=(2+DINODE_NUM)*BLOCK_SIZE; //数据区的开始地址 const unsigned int ACCOUNT_NUM=10; //用户数量 /*inode结构体*/ struct inode{ unsigned short di_tag; /*inode标识*/ unsigned short di_number; /*关联文件数,当为0时表示删除文件,如一个目录至少 包含两个文件:"."和".."*/ unsigned short di_mode; /*存取模式:0为目录,1为文件*/ unsigned short di_userID; /*当前inode所属用户0为根目录ID,一次下去是管理员目

操作系统文件管理系统模拟实验

文件管理系统模拟 1.实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 2.实验内容 为Linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条) login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。 3.实验提示 (1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。 (2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。 4.源代码 #include #include #include #define MEM_D_SIZE 1024*1024 //总磁盘空间为1M #define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024 //磁盘块数目1K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号 #define ROOT_DISK_SIZE sizeof(struct direct) //根

计算机操作系统第七章-文件管理资料

第七章文件管理 第一节文件和文件系统 一、文件系统的引入 1、用户在使用计算机的过程中遇到的有关软件资源的两个基本问题: ●产生了新的资源时:怎样长期存放; ●使用系统中现有资源时:怎样检索,如何使用; 解决的方法:把信息以一种单元--文件--的形式存储在磁盘或其他外部存储介质上。文件由操作系统来统一管理,包括:文件的结构,命名,存取,使用,保护,以及实现方法。 2、现代OS中引入文件系统的目的 ●管理系统和用户的软件资源,让用户实现对信息的“按名存取”; ●提供信息的存储、检索、更新、共享和文件保护等一系列文件操作,使用户能方便有效地使用和操作文件; ●文件系统给用户带来的好处是:使用方便、数据安全、接口统一 3、文件系统的功能 ●统一管理文件的存储空间(外存空间),实施存储空间的分配与回收●实现文件的按名存取:名字空间映射存储空间 ●实现文件信息的共享,并提供文件的保护和保密措施 ●向用户提供一个方便使用的接口 ●系统维护及向用户提供有关信息 ●提供与I/O的统一接口 文件系统在操作系统接口中占的比例最大,用户使用操作系统的

感觉在很大程度上取决于对文件系统的使用效果。 二、文件系统中的相关概念 1、数据项:构成文件内容的基本单位 ●基本数据项。这是用于描述一个对象的某种属性的字符集,是数据组织中可以命名的最小逻辑数据单位,即原子数据,又称为数据元素或字段。它的命名往往与其属性一致。 ●组合数据项。它是由若干个基本数据项组成的,简称组项。 2、记录:是一组相关数据项的集合,用于描述一个对象在某方面的一组属性。 3、关键字:是能唯一标识一个记录的数据项。记录的关键字可以不止一个;关键字可以是一个基本数据项,也可以是一个组合数据项。 4、文件:是指由创建者所定义的、具有文件名的一组相关信息的集合,可分为有结构文件和无结构文件两种。 在有结构的文件中,文件由若干个相关记录组成(是记录的序列);而无结构文件则被看成是一个字符(字节)流。 文件是文件系统中一个最大的数据单位,它描述了一个对象集。 图7-1文件、记录和数据项之间的层次关系

实验三 虚拟文件管理

实验三文件管理 模拟文件存储空间管理 1.内容:模拟文件存储空间的管理,采用空白文件目录法和空白块链法实施空间分配。2.思想: 文件存储空间管理是文件系统的重要内容。常用的管理思想有空白文件目录法、空白块链法和位示图法。本实验采用前两种方法进行空间分配。 (1)空白文件目录法进行空间分配时,需要建立相关的数据结构,记录目前空白区域和已使用区域,假设开始时全部区域空闲。当有文件需要存储时,先检查空白文件目录,找到适合区域立即分配,并修改空白文件目录表和已使用区域分配表。为此需建立两张表格,分别记录相关数据。 序号首空白块号空白快个数物理块号备注 1 0 100 0,1,2,……,98,99 空白文件目录表(初始) 序号首空白块号空白块个数物理块号标志 1 2 4 2,3,4,5 未分配 2 9 3 9,10,11 未分配 3 25 5 25,26,27,28,29 未分配 4 39 2 39,40 未分配 5 ………………未分配 空白文件目录(中间) 文件标识首块号文件块个数状态备注beta 0 2 占用 Alpha 6 3 占用 Toyota 12 13 占用 Sony 30 9 占用 Ford 50 4 占用 …………………… 已使用区域表(中间)

上述两张表的数据在系统运行中是发生变化的。文件空闲区分配和释放算法如下图所示: 图一文件空闲区分配算法

图二文件空闲区回收算法

(2)空白块链法进行空间分配时,需要建立链表数据结构,将空闲块按顺序加以组织,分配和回收时在链首完成,同时建立文件目录,记录文件占用空间情况。 文件标识首块号备注 beta 0 Alpha 6 Toyota 12 Sony 30 Ford 50 ………… 4.书写实验报告: 数据结构:使用了链表作为数据结构,创建一条有一百个节点的链表,链表中定义了文件的名称,标识符等等信息,在添加文件或者删除文件时只需要对其中的标识进行操作就可以达到模拟文件增删的目的。 源代码: #include #include #include #include #define LEN sizeof(black) typedef struct _black { char name[10]; int flag; char flag1[10]; struct _black *next; }black; black *create() { black *head = NULL; black *p1,*p2;

相关主题