操作系统实习写的模拟操作系统文件系统程序,觉得写的不错,放到这保存一下.
#include " disk.h " #include< string .h > #include< iostream.h > #include< iomanip.h > int disk_block[ 10000 ]; int disk_empty; Cdisk::Cdisk() ... { int i = 0 ; char code[ 10 ] = " 123456 " ; for (i = 0 ;i < 10000 ;i ++ ) disk_block[i] = 0 ; this -> user[ 0 ].set_user( " jun " , " 123 " ); disk_empty = 10000 ; cout.setf(ios::left); } Cdisk::~ Cdisk() ... { } int Cdisk::dele_user( int i) ... { Cuse C; C = user[i]; user[i].dele_user(); return 1 ; } int Cdisk::dis_disk() ... { int i = 0 ; cout << setw( 14 ) << " 用户名 " << setw( 14 ) << " 占用空间大小 " << endl; for (i = 0 ;i < 5 ;i ++ ) if (user[i].get_status() == 1 ) cout << setw( 14 ) << user[i].get_name() << setw( 14 ) << user[i].get_length() << endl; cout << " 已用空间: " << 10000 - disk_empty << endl << " 剩余空间 : " << disk_empty << endl; return 1 ; } int Cdisk::login() ... { char n[ 10 ],c[ 10 ]; int i; cout << " 请输入用户名与密码,中间用空格隔开 " << endl; cin >> n >> c; for (i = 0 ;i < 5 ;i ++ ) ... { if (user[i].get_status()) if ( ! strcmp(n,user[i].get_name())) if ( ! strcmp(c,user[i].get_code())) ... { cout << " 登陆成功 " << endl; cout << " 欢迎 " << user[i].get_name() << " 登陆 " << endl; return i; } else ... { cout << " 密码错误 " << endl; return - 1 ; } } cout<< " 没有这个用户 " << endl; return - 1 ; } int Cdisk::set_code() ... { char temp1[ 10 ],temp2[ 10 ]; cout << " 请输入原密码 " << endl; cin >> temp1; if (strcmp(temp1,code)) ... { cout << " 原密码错误 " << endl; return 0 ; } while ( 1 ) ... { cout << " 请输入请新密码 " << endl; cin >> temp1; cout << " 请再输入新密码 " << endl; cin >> temp2; if (strcmp(temp1,temp2)) ... { cout << " 两次输入不一致 " << endl; break ; } cout<< " 密码设置成功 " << endl; strcpy(code,temp1); } return 1 ; } int Cdisk::new_user() ... { char n[ 10 ],c[ 10 ]; int i = 0 ; for (i = 0 ;i < 5 ;i ++ ) if (user[i].get_status() == 0 ) break ; if (i == 5 ) ... { cout << " 已经达到最大用户个数,不能创建 " << endl; return 0 ; } user[i].set_status(1 ); cout << " 请输入用户名称 " << endl; cin >> n; cout << " 请输入密码 " << endl; cin >> c; user[i].set_user(n,c); cout << " 用户创建成功 " << endl; return 1 ; } int Cdisk::first_dele_user() ... { char n[ 10 ],c; int i; cout << " 请输入你要删除的用户的名称 " << endl; cin >> n; for (i = 0 ;i < 5 ;i ++ ) if ( ! strcmp(user[i].get_name(),n) && user[i].get_status()) break ; if (i == 5 ) ... { cout << " 此用户不存在 " << endl; return 0 ; } cout<< " 确认删除此用户?确认请按Y,取消请按其它键 " << endl; cin >> c; if (c != ' Y ' ) ... { cout << " 已经取消删除 " << endl; return 0 ; } this -> dele_user(i); cout << " 用户删除成功 " << endl; return 1 ; } Cuse::Cuse()... { status = 0 ; length = 0 ; now = 0 ; Fhead = 0 ; Dhead = 0 ; } Cuse::~ Cuse() ... { disk_empty += length; length = 0 ; UFD * f = Fhead; DIR * d = Dhead; while (f != 0 ) ... { if (f -> next == 0 ) ... { this -> dele_file(f); f = 0 ; break ; } while (f -> next -> next != 0 ) f = f -> next; this -> dele_file(f -> next); f -> next = 0 ; f = Fhead; } while (d != 0 ) ... { if (d -> next == 0 ) ... { this -> dele_dir(d); d = 0 ; break ; } while (d -> next -> next != 0 ) d = d -> next; this -> dele_dir(d -> next); d -> next = 0 ; d = Dhead; } }int Cuse::new_file() ... { int i = 0 ,j = 0 ; UFD * p = 0 ; p = new UFD; if (p == 0 ) ... { cout << " 无可用内存空间,创建文件失败 " << endl; return 1 ; } cout<< " 请输入建立的文件的名称,长度,属性(0:只读,1:读写 " << endl; cin >> p -> name >> p -> length >> p -> attribute; if (p -> length > disk_empty) ... { cout << " 作业太大,当前硬盘可用空间为: " << disk_empty << endl; delete p; return 0 ; } for (i = 0 ;i < p -> length && i < 10 ;i ++ ) for (j;j < 10000 ;j ++ ) if (disk_block[j] == 0 ) ... { p -> a[i] = j; disk_block[j] = 1 ; j ++ ; break ; } p-> p1 = 0 ; p -> p2 = 0 ; if (p -> length > 10 ) // 一级索引的实现 ... { p -> p1 = new int [ 100 ]; for (i = 10 ;i < p -> length && i < 110 ;i ++ ) for (j;j < 10000 ;j ++ ) if (disk_block[j] == 0 ) ... { ( p -> p1)[i - 10 ] = j; disk_block[j] = 1 ; j ++ ; break ; } if (p -> length > 110 ) // 二级索引的实现 ... { p -> p2 = new int [ 100 ][ 100 ]; for (i = 110 ;i < p -> length;i ++ ) for (j;j < 10000 ;j ++ ) if (disk_block[j] == 0 ) ... { int m = (i - 110 ) / 100 ; int k = (i - 110 ) % 100 ; p -> p2[m][k] = j; disk_block[j] = 1 ; j ++ ; break ; } } } if (now == 0 ) ... { p -> next = Fhead; Fhead = p; } else ... { p -> next = now -> File_head; now -> File_head = p; DIR * h = now; while (h != 0 ) ... { h -> length += p -> length; h = h -> above; } } cout<< " 文件创建成功 " << endl; disk_empty = disk_empty - p -> length; length += p -> length; return 1 ; } int Cuse::new_dir() ... { DIR * p, * h; cout << " 请输入新目录的名字 " << endl; p = new DIR; cin >> p -> name; p -> Dir_head = 0 ; p -> length = 0 ; p -> File_head = 0 ; if (now == 0 ) h = Dhead; else h= now -> Dir_head; while (h != 0 ) ... { if ( ! strcmp(h -> name,p -> name)) ... { cout << " 此目录已经存在 " << endl; return 0 ; } h= h -> next; } if (now == 0 ) ... { p -> above = 0 ; p -> next = Dhead; Dhead = p; } else ... { p -> above = now; p -> next = now -> Dir_head; now -> Dir_head = p; } cout<< " 目录创建成功 " << endl; return 1 ; } int Cuse::goback() ... { if (now == 0 ) ... { cout << " 已经是主目录,不能向上 " << endl; return 0 ; } now= now -> above; return 1 ; } int Cuse::open_dir() ... { char name[ 10 ]; DIR * p; if (now == 0 ) p = Dhead; else p= now -> Dir_head; cout << " 请输入你要打开的目录名称 " << endl; cin >> name; int flag = 0 ; while (p != 0 ) ... { if (strcmp(p -> name,name) == 0 ) ... { now = p; return 1 ; } p= p -> next; } cout<< " 当前目录没有这个目录 " << endl; return 0 ; } int Cuse::first_dele_file() ... { char temp[ 10 ]; cout << " 请输入你要删除的文件名 " << endl; cin >> temp; UFD * f = Fhead; UFD * above = 0 ; if (now != 0 ) f = now -> File_head; while (f != 0 ) ... { if ( ! strcmp(f -> name,temp)) break ; above = f; f = f -> next; } if (f == 0 ) ... { cout << " 此文件不存在 " << endl; return 0 ; } disk_empty+= f -> length; if (now == 0 ) ... { if (f == Fhead) Fhead = Fhead -> next; else above-> next = f -> next; } else ... { DIR * d = now; while (d != 0 ) // 修改删除文件后各级目录的大小 ... { d -> length -= f -> length; d = d -> above; } if (f == now -> File_head) // 删除文件结点 now -> File_head = now -> File_head -> next; else above-> next = f -> next; } length-= f -> length; this -> dele_file(f); cout << " 删除成功 " << endl; return 1 ; } int Cuse::dele_file(UFD * f) ... { int i = 0 ,m; for (i = 0 ;i < 10 && i < f -> length;i ++ ) ... { m = f -> a[i]; disk_block[m] = 0 ; } if (f -> p1 != 0 ) ... { for (i = 10 ;i < 110 && i < f -> length;i ++ ) ... { m = f -> p1[i - 10 ]; disk_block[m] = 0 ; } delete [](f-> p1); } if (f -> p2 != 0 ) ... { for (i = 110 ;i < f -> length;i ++ ) ... { m = (f -> p2)[(i - 110 ) / 100 ][(i - 110 ) % 100 ]; disk_block[m] = 0 ; } delete [](f-> p2); delete f; } f= 0 ; return 1 ; } int Cuse::first_dele_dir() ... { char n[ 10 ]; char c; DIR * p, * above = 0 ; p = Dhead; if (now != 0 ) p = now -> Dir_head; cout << " 请输入你要删除的目录的名称 " << endl; cin >> n; while (p != 0 ) ... { if ( ! strcmp(p -> name,n)) break ; above = p; p = p -> next; } if (p == 0 ) ... { cout << " 没有这个目录 " << endl; return 0 ; } cout<< " 你确定要删除当前目录及此目标下面的所有信息吗?按0确定,按其它键取消 " << endl; cin >> c; if (c != ' 0 ' ) return 0 ; disk_empty += p -> length; if (now == 0 ) ... { if (p == Dhead) Dhead = Dhead -> next; else above-> next = p -> next; } else ... { if (p == now -> Dir_head) now -> Dir_head = now -> Dir_head -> next; else above-> next = p -> next; above = now; while (above != 0 ) // 修改删除目录后各级目录的大小 ... { above -> length -= p -> length; above = above -> above; } } length-= p -> length; this -> dele_dir(p); p = 0 ; cout << " 删除成功 " << endl; return 1 ; } int Cuse::dele_dir(DIR * p) ... { int flag = 0 ; DIR * d = p -> Dir_head; UFD * f = p -> File_head; if (f != 0 ) ... { while (p -> File_head -> next != 0 ) // 删除此目录下的文件 ... { f = p -> File_head; while (f -> next -> next != 0 ) // 寻找最后一个文件结点 f = f -> next; this -> dele_file(f -> next); f -> next = 0 ; } if (p -> File_head -> next == 0 ) ... { this -> dele_file(p -> File_head); p -> File_head = 0 ; } } if (d != 0 ) ... { while (p -> Dir_head -> next != 0 ) // 删除此目录下的目录 ... { d = p -> Dir_head; while (d -> next -> next != 0 ) // 寻找最后一个文件结点 d = d -> next; this -> dele_dir(d -> next); // 递归调用此函数 d -> next = 0 ; } if (p -> Dir_head -> next == 0 ) ... { this -> dele_dir(p -> Dir_head); p -> Dir_head = 0 ; } } delete p; p= 0 ; return 1 ; } int Cuse::dis_now() ... { DIR * d = Dhead; UFD * f = Fhead; if (now != 0 ) ... { d = now -> Dir_head; f = now -> File_head; } if (d == 0 && f == 0 ) ... { cout << " 当前目标为空目录 " << endl; return 0 ; } cout<< " 当前目录大小: " ; if (now == 0 ) cout << length; else cout<< now -> length; cout << endl; if (d == 0 ) cout << " 当前目录下没有目录 " << endl; else ... { cout << " 当前目录下包含如下目录 " << endl; cout << setw( 14 ) << " 目录名称 " << setw( 14 ) << " 目录大小 " << endl; while (d != 0 ) ... { cout << setw( 14 ) << d -> name << setw( 14 ) << d -> length << endl; d = d -> next; } } if (f == 0 ) cout << " 当前目录下没有文件 " << endl; else ... { cout << " 当前目录下包含如下文件 " << endl; cout << setw( 14 ) << " 文件名称 " << setw( 14 ) << " 文件大小 " << setw( 14 ) << " 文件属性 " << endl; while (f != 0 ) ... { cout << setw( 14 ) << f -> name << setw( 14 ) << f -> length << setw( 14 ) << f -> attribute << endl; f = f -> next; } } return 1 ; } int Cuse::open_file() ... { char n[ 10 ]; cout << " 请输入你要打开的文件的名称 " << endl; cin >> n; UFD * f = Fhead; if (now != 0 ) f = now -> File_head; while (f != 0 ) ... { if ( ! strcmp(f -> name,n)) ... { cout << " 文件打开成功 " << endl; return 1 ; } f= f -> next; } cout<< " 当前目录中没有这个文件 " << endl; return 0 ; } int Cuse::set_code() ... { char a1[ 10 ],a2[ 10 ]; cout << " 请输入原密码 " << endl; cin >> a1; if (strcmp(a1,code)) ... { cout << " 密码错误 " << endl; return 0 ; } while ( 1 ) ... { cout << " 请输入新密码 " << endl; cin >> a1; cout << " 请再次输入新密码 " << endl; cin >> a2; if (strcmp(a1,a2)) cout << " 两次输入密码不一致,请重新输入 " << endl; else ... { strcpy(code,a1); cout << " 密码修改成功 " << endl; break ; } } return 1 ; } DIR * Cuse::get_now() ... { return now; } int Cuse::set_user( char * n, char * c) ... { strcpy(name,n); strcpy(code,c); status = 1 ; return 1 ; } void Cuse::set_status( int b) ... { status = b; } int Cuse::get_status() ... { return status; } const char * Cuse::get_code() ... { return code; } const char * Cuse::get_name() ... { return name; } int Cuse::get_length() ... { return length; } int Cuse::dis_dir(DIR * d) // 显示当前路径 ... { if (d == 0 ) return 0 ; if (d -> above != 0 ) this -> dis_dir(d -> above); // 递归调用此函数 cout << d -> name << ' / ' ; return 0 ; } int Cuse::dis_file() ... { int i; char n[ 10 ]; UFD * f = Fhead; if (now != 0 ) f = now -> File_head; cout << " 请输入你要查看的文件的名称 " << endl; cin >> n; while (f != 0 ) ... { if ( ! strcmp(n,f -> name)) break ; f = f -> next; } if (f == 0 ) ... { cout << " 当前目录下没有这个文件 " << endl; return 0 ; } cout<< " 此文件占用硬盘块号如下: " << endl; for (i = 0 ;i < f -> length && i < 10 ;i ++ ) ... { cout << setw( 6 ) << f -> a[i]; if ((i + 1 ) % 10 == 0 ) cout << endl; } for (i = 10 ;i < f -> length && i < 110 ;i ++ ) // 显示一级索引块号 ... { cout << setw( 6 ) << f -> p1[i - 10 ]; if ((i + 1 ) % 10 == 0 ) cout << endl; } for (i = 110 ;i < f -> length;i ++ ) // 显示二级索引块号 ... { cout << setw( 6 ) << f -> p2[(i - 110 ) / 100 ][(i - 110 ) % 100 ]; if ((i + 1 ) % 10 == 0 ) cout << endl; } cout<< endl; return 1 ; } int Cuse::dele_user() ... { length = 0 ; Fhead = 0 ; Dhead = 0 ; now = 0 ; status = 0 ; return 1 ; } #include " disk.h " #include< string .h > #include< iostream.h > void main() ... { char c; Cdisk D; // 声明管理员类的对象; int i = 1 ,n,flag = 1 ; cout << " 可使用用户名jun密码123登陆,也可使用管理员登陆后自行创建用户登陆 " << endl; while (flag) ... { cout << " ****************************** " << endl; cout << " ***1.管理员登陆 **** " << endl; cout << " ***2.用户登陆 **** " << endl; cout << " ***3.退出 **** " << endl; cout << " ****************************** " << endl; cout << " 请输入选择: " ; cin >> c; switch (c) ... { case ' 1 ' :flag = 1 ; cout << " 登陆成功,欢迎管理员登陆 " << endl; while (flag) ... { cout << " ****************************** " << endl; cout << " ***1.创建用户 **** " << endl; cout << " ***2.删除用户 **** " << endl; cout << " ***3.查看当前用户 **** " << endl; cout << " ***4.修改密码 **** " << endl; cout << " ***5.返回登陆窗口 **** " << endl; cout << " ****************************** " << endl; cout << " 请输入选择: " ; cin >> c; switch (c) ... { case ' 1 ' :D.new_user(); break ; case ' 2 ' :D.first_dele_user(); break ; case ' 3 ' :D.dis_disk(); break ; case ' 4 ' :D.set_code(); break ; case ' 5 ' :flag = 0 ; break ; default :cout << " 请输入1-5 " << endl; } } flag= 1 ; break ; case ' 2 ' :n = D.login(); if (n ==- 1 ) break ; while (flag) ... { cout << " ****************************** " << endl; cout << " ***1.创建文件 **** " << endl; cout << " ***2.删除文件 **** " << endl; cout << " ***3.创建目录 **** " << endl; cout << " ***4.删除目录 **** " << endl; cout << " ***5.打开目录 **** " << endl; cout << " ***6.返回上一层目录 **** " << endl; cout << " ***7.查看当前目录信息 **** " << endl; cout << " ***8.修改密码 **** " << endl; cout << " ***9.查看文件块号 **** " << endl; cout << " ***0.退出登陆 **** " << endl; cout << " ****************************** " << endl; cout << " 当前目录为: " << D.user[n].get_name() << ' / ' ; D.user[n].dis_dir(D.user[n].get_now()); cout << endl; cout << " 请输入选择: " ; cin >> c; switch (c) ... { case ' 1 ' :D.user[n].new_file(); break ; case ' 2 ' :D.user[n].first_dele_file(); break ; case ' 3 ' :D.user[n].new_dir(); break ; case ' 4 ' :D.user[n].first_dele_dir(); break ; case ' 5 ' :D.user[n].open_dir(); break ; case ' 6 ' :D.user[n].goback(); break ; case ' 7 ' :D.user[n].dis_now(); break ; case ' 8 ' :D.user[n].set_code(); break ; case ' 9 ' :D.user[n].dis_file(); break ; case ' 0 ' :flag = 0 ; break ; default : cout << " 请输入0-9 " << endl; } } flag= 1 ; break ; case ' 3 ' :flag = 0 ; break ; default :cout << " 请输入1-3 " << endl; } } }
使用混合索引分配方式来为存储文件所在外存的块号,以多级目录结构来组织目录,以位示图法对文件存储空间进行管理,
源代码
// disk.h: interface for the Cdisk class. // /**/ ///////////////////////////////////////////////////////////////////// / #if !defined(AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_) #define AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 extern int disk_block[ 10000 ]; extern int disk_empty; typedef struct UFD // 存储文件信息 ... { char name[ 10 ]; int attribute; // 文件属性 int length; int a[ 10 ]; int * p1; // 一级索引 int ( * p2)[ 100 ]; // 二级索引 struct UFD * next; // 指向文件链表中此文件结点的下一个结点 } UFD; typedef struct DIR // 存储目录信息 ... { DIR * above; // 指向目录链表中此目录结点的上一个结点 char name[ 10 ]; int length; DIR * next; // 指向目录链表中引目录结点的下一个结点 UFD * File_head; // 此目录下文件链表的头指针 DIR * Dir_head; // 此目录下目录链表的头指针 } DIR; class Cuse // 定义管理用户目录的类 ... { DIR * now; // 当前目录 UFD * Fhead; // 文件链表的头结点 DIR * Dhead; // 目录链表的头结点 char code[ 10 ]; // 用户密码 char name[ 10 ]; // 用户名称 int length; // 用户所使用空间大小 int status; // 此对象是否已经分配给用户 public : void set_status( int ); int dele_user(); int dis_file(); // 显示文件所占外存块号 int dis_dir(DIR * d); // 实现显示当前路径的函数 int get_length(); char const * get_name(); char const * get_code(); int get_status(); int set_user( char * , char * ); // 设置用户名与密码 DIR * get_now(); int dele_file(UFD * f); // 删除文件的具体实现部分 int dele_dir(DIR * ); // 删除目录的具体实现部分 Cuse(); ~ Cuse(); int goback(); // 返回上一级目录 int dis_now(); // 显示当前目录的信息 int new_file(); int new_dir(); int open_dir(); int open_file(); int first_dele_file(); // 实现删除文件的前部分工作 int first_dele_dir(); // 实现删除目录的前部分工作 int set_code(); } ; class Cdisk ... { public : Cuse user[ 5 ]; char code[ 10 ]; int dis_disk(); int first_dele_user(); int dele_user( int ); int new_user(); // 查看当前用户信息与外存空间使用情况 int set_code(); int login(); // 用户登陆 Cdisk(); virtual ~ Cdisk(); } ; #endif // !defined(AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_)