二级文件系统设计

【设计题目】

二级文件系统设计

【设计目的】

(1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。

(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。

(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力

【设计内容】

  • 任务

为Linux系统设计一个简单的二级文件系统。

1.可以实现下列几条命令:

login        用户登录

dir          列目录

create       创建文件

delete       删除文件

open         打开文件

close        关闭文件

read         读文件

write        写文件

cd           进出目录

2.列目录时要列出文件名,物理地址,保护码和文件长度

3.源文件可以进行读写保护

  • 程序设计
    1. 设计思想

本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。

首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。q

578812414

部分代码如下

#include "stdio.h"
#include "string.h"
#include "conio.h"
#include "stdlib.h"
#define MAXNAME 25  /*the largest length of mfdname,ufdname,filename*/
#define MAXCHILD 50 /*the largest child*/
#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/
#define MAXCONTENT 1024  // 假设最大内容长度为 1024

typedef struct  /*the structure of OSFILE*/
{
	int  fpaddr;                /*file physical address*/
    int  flength;               /*file length*/
    int  fmode;   /*file mode:0-Read Only;1-Write Only;2-Read and Write(default);*/
    char fname[MAXNAME];        /*file name*/
} OSFILE;

typedef struct     /*the structure of OSUFD*/
{
	char ufdname[MAXNAME];   /*ufd name*/
	OSFILE ufdfile[MAXCHILD];   /*ufd own file*/
}OSUFD;

typedef struct  /*the structure of OSUFD'LOGIN*/
{
	char ufdname[MAXNAME];       /*ufd name*/
    char ufdpword[8];            /*ufd password*/
} OSUFD_LOGIN;

typedef struct     /*file open mode*/
{
	int ifopen;     /*ifopen:0-close,1-open*/
    int openmode;   /*0-read only,1-write only,2-read and write,3-initial*/
}OSUFD_OPENMODE;

OSUFD *ufd[MAXCHILD];   /*ufd and ufd own files*/
OSUFD_LOGIN ufd_lp;

int ucount=0;  /*the count of mfd's ufds*/
int fcount[MAXCHILD];  /*the count of ufd's files*/
int loginsuc=0; /*whether login successfully*/
char username[MAXNAME];  /*record login user's name22*/
char dirname[MAXNAME];/*record current directory*/
int fpaddrno[MAX];  /*record file physical address num*/
OSUFD_OPENMODE ifopen[MAXCHILD][MAXCHILD]; /*record file open/close*/
int wgetchar; /*whether getchar()*/

FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file;

void LoginF();  /*LOGIN FileSystem*/
void DirF();  /*Dir FileSystem*/
void CdF();  /*Change Dir*/
void CreateF();  /*Create File*/
void DeleteF(); /*Delete File*/
void ModifyFM(); /*Modify FileMode*/
void OpenF();  /*Open File*/
void CloseF();  /*Close File*/
void ReadF(); /*Read File*/
void WriteF(); /*Write File*/
void QuitF(); /*Quit FileSystem*/
void help();

char *rtrim(char *str);  /*remove the trailing blanks.*/
char *ltrim(char *str);  /*remove the heading blanks.*/
void InputPW(char *password);  /*input password,use '*' replace*/
void SetPANo(int RorW);  /*Set physical address num*/
int ExistD(char *dirname);  /*Whether DirName Exist,Exist-i,Not Exist-0*/
int WriteF1(); /*write file*/
int ExistF(char *filename);  /*Whether FileName Exist,Exist-i,Not Exist-0*/
int FindPANo();  /*find out physical address num*/


 
void clrscr()
{
	system("cls");
}

int main()
{
	int i,choice1;
	char choice[50];  /*choice operation:dir,create,delete,open,delete,modify,read,write*/
	int choiceend=1;  /*whether choice end*/
	char *rtrim(char *str);  /*remove the trailing blanks.*/
	char *ltrim(char *str);  /*remove the heading blanks.*/

	if((fp_mfd=fopen("c:\\osfile\\mfd.txt","rb"))==NULL)
	{
		fp_mfd=fopen("c:\\osfile\\mfd.txt","wb");
		fclose(fp_mfd);
	}

	for(i=0;i<MAX;i++) fpaddrno[i]=0;
	//textattr(BLACK*16|WHITE);
	clrscr();   /*clear screen*/
	LoginF();   /*user login*/
	clrscr();

	if(loginsuc==1)  /*Login Successfully*/
	{
		while (1)
		{
			wgetchar=0;
			if (choiceend==1)
				printf("\n\nC:\\%s>",strupr(dirname));
			else 
				printf("Bad command or file name.\nC:\\%s>",strupr(username));
		    gets(choice);

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值