测品娱乐
您的当前位置:首页基于Linux的文件系统设计

基于Linux的文件系统设计

来源:测品娱乐


无敌

操作系统课程设计

说 明 书

学 院、系: 专 业: 学 生 姓 名:

软件学院 软件工程 学 号:

设 计 题 目: 基于Linux的模拟文件系统的设计与实现

起 迄 日 期: 指 导 教 师:

1.需求分析

1.1 功能介绍

基于Linux的模拟文件系统的设计与实现完成以下功能: (1)创建用户:创建多个用户,输入用户名;每个用户最多可以

保存多个文件。

(2)用户登录:手动的登录已经创建的用户,正确输入用户名即可成功登录。

(3)创建二级文件目录(MD):手动的输入目录名称,(即设置

主目录(MFD)和用户文件目录(UFD))。

(4)显示目录(show_content):将用户创建的目录显示在界面上。

(5)删除目录(delete_content):手动输入目录的名称即可删除已经创建的目录。

(6)进入目录:进入目录内部,可以进行文件的各种操作。 (7)复制目录(modify_content):在用户登录后,输入要修改的

目录名称,对其进行修改,输入新的目录名并保存。 (8)建立一个文件(create):在目录中手动输入文件名,可以

创建新的文件,在创建的同时输入文件的保护码,对文件内容进行保护,防止信息泄露。

1

(9)删除一个文件(delete):手动输入已经创建的文件的名称,即可删除此文件。

(10)写文件(write):手动的在文件中写入内容。 (11)读文件(read):查看文件中的已经写入的内容。 (12)修改文件属性(modifyfile):通过修改属性改变文件类型。

基于其低廉成本与高度可设定性,Linux常常被应用于嵌入式系统,例如机顶盒、移动电话及行动装置等。在移动电话上,Linux已经成为与Symbian OS、Windows Mobile系统并列的三大智能手机操作系统之一;而在移动装置上,则成为Windows CE与Palm OS外之另一个选择。目前流行的TiVo数位摄影机使用了经过定制化后的Linux。此外,有不少硬件式的网络防火墙及路由器,例如部份LinkSys的产品,其内部都是使用Linux来驱动、并采用了操作系统提供的防火墙及路由功能。 1.2 目的及意义

Linux以它的高效性和灵活性著称。它能够在PC计算机上实现全部的Unix特性,具有多任务、多用户的能力。Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Window图形用户界面,如同我们使用Windows NT一样,允许

2

我们使用窗口、图标和菜单对系统进行操作。

Linux之所以受到广大计算机爱好者的喜爱,主要原因有两个,一是它属于自由软件,用户不用支付任何费用就可以获得它和它的源代码,并且可以根据自己的需要对它进行必要的修改,无偿对它使用,无约束地继续传播。另一个原因是,它具有Unix的全部功能,任何使用Unix操作系统或想要学习Unix操作系统的人都可以从Linux中获益。

在Linux操作系统中实现文件的各种操作,即创建、删除、修改、写入、读取等。基于Linux的模拟文件系统的设计与实现,实现了采用用户登录机制,可以查看文件信息,管理文件及文件夹。在界面中用户可以手动的进行操作,每一步都有操作成功或失败的提示,清晰的展示每一步的操作过程,用户可以方便的实现对文件的操作,例如:创建、修改、删除等。

经过几天的努力完成了基于Linux的模拟文件系统的设计与实现这一课题,按照具体的要求,将每个功能实现并附上温馨提示,主要的功能有:展示了添加用户、用户登录、创建二级目录、修改目录名、删除目录、显示全部目录、创建文件、修改文件名、删除文件、写入文件、读取文件等功能。 1.3 设计成果

基于Linux的模拟文件系统的设计与实现,实现了采用用户登录机制,可以查看文件信息,管理文件及文件夹。在界面中用户可以手动的进行操作,每一步都有操作成功或失败的提示,清晰的展示每一

3

步的操作过程,用户可以方便的实现对文件的操作,例如:创建、修改、删除等。

经过几天的努力完成了基于Linux的模拟文件系统的设计与实现这一课题,按照具体的要求,将每个功能实现并附上温馨提示,主要的功能有:展示了用户登录、创建二级目录、修改目录名、删除目录、显示全部目录、创建文件、修改文件名、删除文件、写入文件、读取文件等功能。

2.总体设计

2.1功能介绍

本系统包括用户管理、目录管理、文件管理共3个模块。在用户管理模块中,包括创建用户,输入用户名;用户登录等功能。在目录管理模块中,包括创建二级文件目录,输入文件的目录名称;显示目录,输入文件目录的名字,显示出对应的目;删除目录;进入目录主要是为了操作目录内部的文件。文件管理模块,包括文件的创建,在进入目录后可以按照提示输入文件的名称,输入密码,创建新的文件并添加文件的保护码;打开一个文件,在目录中按照提示输入文件的名称,便可以打开目录中对应的文件;打开全部文件,进入目录后,按照提示输入相应的操作,即可打开本目录下所有的文件;删除一个文件,进入目录按照提示选择相应的操作,输入文件名称,即可删除此文件;写入文件,在目录中打开一个文件,写入内容;读取文件,在目录中打开文件,查看文件的内容。修改保护码,进入目录输入文

4

件的名称,按照提示修改文件的保护码。形象展示见下图2.1:

图2.1

2.2模块关联

在系统中各个模块之间有着一定的联系,系统中创建多个用户,每一个用户可以创建多个目录,在目录中最多创建10个文件。用户与目录之间存在一对多的关系,目录与文件之间也存在一对多的关系,用户与文件之间也存在一对多的关系。具体描述见下图:

5

基于Linux的模拟文件系统的设计与实现 用户管理目录管理文件管理 创建用户用户登录创建目录显示目录删除目录创建文件打开一个文件打开全部文件删除一个文件写入文件读取文件

用户名 目录名 1 用户 n 目录 1 1 n 文件 n 文件属性 文件名 文件内容

图2.2

图2.3

6

用户退出 显示 删除 创建 读取 写入 打开 删除 是 创建目录 验证 否 用户登录 创建文件

删除文件

开始 遍历i节点区 否 要删除的文件是否存是 释放文件对应的i节点区 文件是否大于的一是 释放两个磁盘释放一个磁盘否 结束

图2.4

3. 详细设计

3.1文件的复制 int copy_file(){ char from[20]; char to[20];

printf(\"请输入源目录:\\n\"); scanf(\"%s\

printf(\"请输入目标目录:\\n\"); scanf(\"%s\

char buffer[1024];//缓冲区

7

FILE *in,*out;//文件流

if((in=fopen(from,\"r\"))==NULL){//fopen打开文件,指向该流的文件指针就会被返回

printf(\"源文件不存在,请检查路径输入是否存在!\\n\");

exit(1); }

if((out=fopen(to,\"w+\"))==NULL){//打开目标文件的文件流

printf(\"创建目标文件流失败!\\n\"); exit(1); }

int len;//len为fread读到的字节长

while((len=fread(buffer,1,1024,in))>0){//从源文件中读取数据并放到缓冲区中

fwrite(buffer,1,len,out);//将缓冲区的数据写到目标文件中

}

fclose(out); fclose(in); return 0; }

3.2文件的权限查看 void power() {

8

char ptr[20]; int a,b;

printf(\"请输入您要查看的文件名!\\n\"); scanf(\"%s\ a=access(ptr,R_OK); b=access(ptr,W_OK); if(a==0)

printf(\"拥有读%s的权限!\\n\ else

printf(\"不拥有读%s的权限!\\n\ if(b==0)

printf(\"拥有写%s的权限!\\n\ else

printf(\"不拥有写%s的权限!\\n\

struct stat st;

if(stat(ptr, &st) == -1){ perror(\"stat\"); } else{

printf(\"文件所有者UID=%ld\\n\ printf(\"文件创建时间%s\ } }

9

3.3文件的删除 void delete_file() {

char ptr[20];

printf(\"请输入您要删除的文件名\\n\"); scanf(\"%s\ if (unlink(ptr)==1){ printf(\"文件删除失败\\n\");}

else{ printf(\"文件删除成功\\n\");} }

4.运行截图

4.1 文件的删除:

图4.1

10

4.2查看文件权限

图4.2

4.3复制文件

图4.3

11

5.心得体会

通过本次课程设计我对文件系统有了更深的了解。在现代操作系统中,几乎毫无例外地是通过文件系统来组织和管理在计算机中所存储的大量程序和数据的。此次课程设计实现的文件系统主要是通过其管理功能来呈现给大家的。我们从网上找了很多资料,参照网上的资料编写程序代码。那些链表指针修改的顺序稍微不对功能就可能实现不了甚至是整个程序都会出错。

任何程序都离不了增删改查四个基本操作,我们此次的课程设计也如此。性,任何程序的运行都离不开操作系统。文件系统,其实就存在于我们的生活当中。以前很多人都说学校里学到知识不实用,但我看不然,学校知识与我们的生活息息相关,在学校认真学习知识,在以后的工作和生活中都会用到。

12

附录:

#include //调用系统函数 #include #include #include #include #include #include

#include #include #include void add_content(); void delete_content(); //创建目录 void add_content() {

char ptr[20]; int a;

printf(\"请输入您要创建的目录的名字!\\n\"); scanf(\"%s\

a=mkdir(ptr,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);

13

if(a==0)

printf(\"创建成功\\n\"); else

printf(\"该目录已经存在,创建失败\\n\"); }

void cd_content() {

char curdir[30]; //当前目录 char dirname[10]; //改变目录 printf(\"当前路径为:\\n\"); strcpy(curdir,getcwd(NULL,0)); printf(\"%s\\n\ printf(\"请输入改变的目录\\n\"); scanf(\"%s\ if(chdir(dirname)==0){

printf(\"进入子目录成功,\"); //录

strcat(curdir,\"/\"); //连接 strcat(curdir,dirname); printf(\"改变后的目录为:\\n\"); printf(\"%s\\n\ }

14

改变目

else{

printf(\"该子目录不存在!请核对后输入。\\n\"); } }

void rcd_content() {

char curdir[500]={'\\0'}; // char dirname[500]={'\\0'}; // printf(\"当前路径为:\\n\"); strcpy(curdir,getcwd(NULL,0)); printf(\"%s\\n\ int i=499, n=0; for(;i>=0;i--){

if(curdir[i] == '/') break; }

for(;ndirname[n] = curdir[n]; }

if(chdir(dirname)==0){

15

当前目录 改变目录

printf(\"返回上级目录成功!\\n\"); printf(\"当前路径为:\\n%s\\n\ }else{

printf(\"返回上级目录失败\\n\"); } }

//删除目录

void delete_content() {

char ptr[20];

printf(\"请输入您要删除的目录的名字\\n\"); scanf(\"%s\

if (rmdir(ptr)==-1){ printf(\"删除失败\\n\");}

else{ printf(\"删除成功\\n\");} }

//查看目录 int look(){ DIR *dir;

struct dirent *ptr; char w[20];

printf(\"请输入查看的目录:\\n\");

16

scanf(\"%s\ dir = opendir(w); // opendir打开一个目录

while((ptr = readdir(dir)) != NULL) if(ptr->d_type == 8){

printf(\"名称:%s---类型:文件\\n\ }else{

printf(\"名称:%s---类型:文件夹\\n\ptr->d_name); }

/*if(!strcmp(ptr->d_name,\".\")) printf(\"d_name: 以上是文件夹\\n\"); else if (!strcmp(ptr->d_name,\"..\")) printf(\"d_name: 以上是文件\\n\"); else

printf(\"d_name: %s\\n\*/

closedir(dir); return 0; }

//创建文件 /*

17

O_WRONLY | O_CREAT | O_TRUNC 只写,文件不存在那么就创建,文件长度戳为0

S_IRWXU | S_IXGRP | S_IROTH | S_IXOTH 用户读、写、执行、用户组读、执行、其他用户读、执行

*/

void add_file() {

int fd;//文件描述符 char ptr[20];

printf(\"请输入您要创建的文件的名字!\\n\"); scanf(\"%s\

if(fd=open(ptr,O_WRONLY|O_RDONLY|O_CREAT,S_IRWXU|S_IXGRP|S_IROTH|S_IXOTH)==-1)

printf(\"文件已存在,失败!\\n\"); else {

printf(\"成功!\\n\"); } } //读文件 void read_file() {

18

int fd,size;

char buf[20000]={'\\0'}; char ptr[20];

printf(\"请输入您要读取的文件名!\\n\"); scanf(\"%s\ fd=open(ptr,O_RDONLY); if(fd==-1)

printf(\"打开该文件失败!\\n\"); else {

printf(\"打开成功\\n\"); read(fd,buf,sizeof(buf)); printf(\"%s\\n\ close(fd); } } //写文件

void write_file() {

int len=0; int fd=0;

char buf[200]={'\\0'};

19

char list[121]; char ptr[30];

printf(\"输入您要写的文件名\\n\"); scanf(\"%s\

printf(\"输入您要输入的内容\\n\"); scanf(\"%s\ fd=open(ptr,O_WRONLY); if(fd==-1) {

printf(\"文件不存在!请先创建该文件。\\n\"); }else{

int len=100; char *p=NULL; int cnt=0,c;

p = (char *)malloc(len); while((c = getchar())!='\\n') {

p[cnt++] = c; if(cnt >= len-1) {

len+=100;

p=(char *)realloc(p, len);//不够,重新分配

20

内存。

} }

p[cnt] = '\\0'; lseek(fd,0,SEEK_END); printf(\"%d\ write(fd,p,cnt); close(fd); } }

//删除文件 void delete_file() {

char ptr[20];

printf(\"请输入您要删除的文件名\\n\"); scanf(\"%s\ if (unlink(ptr)==1){ printf(\"文件删除失败\\n\");}

else{ printf(\"文件删除成功\\n\");} }

//查看文件权限

21

void power() {

char ptr[20]; int a,b;

printf(\"请输入您要查看的文件名!\\n\"); scanf(\"%s\ a=access(ptr,R_OK); b=access(ptr,W_OK); if(a==0)

printf(\"拥有读%s的权限!\\n\ else

printf(\"不拥有读%s的权限!\\n\ if(b==0)

printf(\"拥有写%s的权限!\\n\ else

printf(\"不拥有写%s的权限!\\n\

struct stat st;

if(stat(ptr, &st) == -1){ perror(\"stat\"); }

22

else{

printf(\"文件所有者UID=%ld\\n\ printf(\"文件创建时间%s\ } }

//复制文件 int copy_file(){ char from[20]; char to[20];

printf(\"请输入源目录:\\n\"); scanf(\"%s\

printf(\"请输入目标目录:\\n\"); scanf(\"%s\

char buffer[1024];//缓冲区 FILE *in,*out;//文件流

if((in=fopen(from,\"r\"))==NULL){//fopen打开文件,指向该流的文件指针就会被返回

printf(\"源文件不存在,请检查路径输入是否存在!\\n\");

exit(1); }

if((out=fopen(to,\"w+\"))==NULL){//打开目标文件的文件

23

printf(\"创建目标文件流失败!\\n\"); exit(1); }

int len;//len为fread读到的字节长

while((len=fread(buffer,1,1024,in))>0){//从源文件中读取数据并放到缓冲区中

fwrite(buffer,1,len,out);//将缓冲区的数据写到目标文件中

}

fclose(out); fclose(in); return 0; }

int login() //用户登陆 {

int x; char id[20]; int check,a=1; char pin1[]=\"111\"; char pin2[]=\"222\";

24

char pin3[]=\"333\"; char pin[20]; DIR *dir; while(a) {

printf(\"* * * * * * * * * * * * * * * * * * * * * * * * * * * *\\n\");

printf(\" * 文件管理系统用户登录 *\\n\");

printf(\"* * * * * * * * * * * * * * * * * * * * * * * * * * * *\\n\");

printf(\"请输入用户名:\\n\"); scanf(\"%s\

if(strcmp(id,pin1)==0) x=1;

else if(strcmp(id,pin2)==0) x=2;

else if(strcmp(id,pin3)==0) x=3; else

printf(\"用户名不存在。\\n\"); switch(x)

25

{ case 3:

printf(\"密码:\\n\"); scanf (\"%s\ check=strcmp(pin,pin3); break; case 2:

printf(\"密码:\\n\"); scanf (\"%s\ check=strcmp(pin,pin2); break; case 1:

printf(\"密码:\\n\"); scanf (\"%s\ check=strcmp(pin,pin1); break; default:

printf(\"您的输入有误,退出!\\n\"); exit(0); } if (check!=0)

26

{

printf(\"\\n密码错误!请重新输入:\\n\"); } else {

printf(\"\\n%s登录成功!\\n\

a=mkdir(pin,S_IRWXU | S_IRWXG | S_IXOTH);

if(a==0)

printf(\"%s主目录创建成功!\\n\ else

printf(\"%s主目录已经存在!\\n\ break; } } }

int content() {

while(1) {

27

S_IROTH |

int m;

printf(\"******************************\\n\"); printf(\"******* 目录操作 *********\\n\"); printf(\"******* 1.创建子目录 *******\\n\"); printf(\"******* 2.进入子目录 *******\\n\"); printf(\"******* 3.返回上一级目录 *******\\n\"); printf(\"******* 4.删除子目录 *******\\n\");

printf(\"******* 5.查看目录下文件 *******\\n\");

printf(\"******* 6.进入文件操作******\\n\"); printf(\"******* 7.退出 *********\\n\"); printf(\"******************************\\n\"); printf(\"请选择\\n\" ); scanf(\"%d\ switch(m) {

case 1:

add_content(); //创建目录 break; case 2:

cd_content(); break;

28

case 3:

rcd_content(); break; case 4:

delete_content(); //删除目录 break;

case 5:

look(); //查看目录

break; case 6:

file(); //文件操作 break;

case 7: exit(0); //退出目录管理 default:

printf(\"您的输入有误,退出!\\n\"); return 0; } }} int file() {

while(1)

29

{ int m;

printf(\"******************************\\n\"); printf(\"******* 文件操作 **********\\n\"); printf(\"******* 1.创建文件 **********\\n\"); printf(\"******* 2.删除文件 **********\\n\"); printf(\"******* 3.读文件************\\n\"); printf(\"******* 4.写文件 *******\\n\"); printf(\"******* 5.查看文件权限 ****\\n\"); printf(\"******* 6.复制文件 ****\\n\"); printf(\"******* 7.返回 *********\\n\"); printf(\"******************************\\n\"); printf(\"请选择\\n\" ); scanf(\"%d\ switch(m) {

case 1:

add_file(); //创建文件 break; case 2:

delete_file(); //删除文件 break;

30

case 3:

read_file(); //读文件 break;

case 4:

write_file(); //写文件 break; case 5:

power(); // break;

case 6:

copy_file(); // break; case 7: return 0; default:

printf(\"您的输入有误,退出! return 0; } }} void main() { login(); content();

31

查看文件权限复制文件 \\n\");

}

32

因篇幅问题不能全部显示,请点此查看更多更全内容