实验四 文件系统管理(二)
文件管理系统实验报告
一、实验目的本次实验旨在通过设计和实现一个简单的文件管理系统,加深对文件管理原理的理解,掌握文件系统的基本操作,包括文件的创建、删除、修改、查询等,并了解文件系统的目录结构和管理机制。
二、实验环境1. 操作系统:Windows 102. 开发工具:Visual Studio 20193. 编程语言:C++4. 实验时间:2023年10月25日三、实验内容1. 文件系统的目录结构设计2. 文件的基本操作实现3. 文件系统的存储管理4. 文件系统的安全机制四、实验步骤1. 目录结构设计根据文件系统的需求,设计以下目录结构:```根目录│├── 文件夹A│ ├── 文件1.txt│ └── 文件2.txt│├── 文件夹B│ └── 文件3.txt│└── 文件夹C```2. 文件的基本操作实现(1)文件创建```cppvoid CreateFile(const std::string& filePath, const std::string& content) {// 检查文件是否存在if (CheckFileExist(filePath)) {std::cout << "文件已存在!" << std::endl;return;}// 创建文件std::ofstream file(filePath);if (file.is_open()) {file << content;file.close();std::cout << "文件创建成功!" << std::endl;} else {std::cout << "文件创建失败!" << std::endl;}}```(2)文件删除```cppvoid DeleteFile(const std::string& filePath) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl;return;}// 删除文件if (remove(filePath) == 0) {std::cout << "文件删除成功!" << std::endl;} else {std::cout << "文件删除失败!" << std::endl;}}```(3)文件修改```cppvoid ModifyFile(const std::string& filePath, const std::string& newContent) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl; return;}// 修改文件内容std::ofstream file(filePath, std::ios::trunc); if (file.is_open()) {file << newContent;file.close();std::cout << "文件修改成功!" << std::endl; } else {std::cout << "文件修改失败!" << std::endl; }}```(4)文件查询```cppvoid QueryFile(const std::string& filePath) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl; return;}// 读取文件内容std::ifstream file(filePath);if (file.is_open()) {std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());std::cout << "文件内容:" << content << std::endl;file.close();} else {std::cout << "文件读取失败!" << std::endl;}}```3. 文件系统的存储管理文件系统采用磁盘文件作为存储介质,通过文件操作实现对文件的读写。
实验四 文件系统 实验报告
文件系统实验报告一、实验目的了解操作系统中文件系统的原理以及实现方法。
二、实验方法通过FAT12文件系统的解读,了解文件系统的原理和实现。
三、实验任务通过对FAT12文件系统的了解,编写程序,读取并列出一个虚拟软盘中文件信息(文件名、属性、修改时间等),以及读取其中的文件内容四、实验要点FAT12文件系统的了解,Linux系统下文件读写相关系统调用。
五、实验过程1. FAT12 文件系统分析簇是操作系统分配文件空间的基本单位,簇由若干个扇区组成。
在FAT12文件系统中,簇号的有效位是12位,所以这种文件系统就被称为FAT12。
FAT12其中,引导区中储存着一些基本的信息。
例如,0x0000000B和0x0000000C 两个字节保存着每个扇区的大小,0x0000000D保存着每个簇占用多少个扇区。
FAT区中储存着簇号。
在0x00000200开始的三个字节,分别储存设备类型标记(0xF0为软盘);第二个第三个字节均为0xFF,是FAT标识符。
在FAT12文件系统中,每个簇占用12位,即1.5个字节。
簇号与地址的对应关系如下表:然后对读出的两个字节进行位运算处理,得到下一簇的簇序号。
注意,这里同样需要对高低位进行处理,即使用位计算的方式提取相应的簇号信息。
根据上述的原理,可以得出一个函数,以一个簇号为参数,返回值为文件下一个簇号。
代码如下:int getNextClutserId(FILE *fp, short clusterId){unsigned short tmp, low = 0, high = 0;;int address = (clusterId * 3 / 2) + 0x0000200;fseek(fp, address, SEEK_SET);fread((void *)(&tmp), 1, sizeof(unsigned short), fp);low = ((tmp & 0xFFF0) >> 4);high = tmp & 0x0FFF;return (clusterId % 2 == 0 ? high : low);}其中,fp 是用于读取文件系统的文件流,clusterID是当前簇号,返回值是下一个簇号。
文件系统实验报告 (2)
试验四文件系统一、实验目得1、用高级语言编写与调试一个简单得文件系统,模拟文件管理得工作过程。
从而对各种文件操作命令得实质内容与执行过程有比较深入得了解。
2、要求设计一个n个用户得文件系统,每次用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验题目:采用二级目录结构实现磁盘文件操作。
要求:1.普通文件得目录项包括文件名,文件类型,文件长度,指向文件内容得指针内容。
2.目录文件得目录项包括目录名,指向下一级目录块得指针内容。
假定每个目录文件最多只能占用一个块;3.程序功能方面得要求: 需要实现一个命令行操作界面,包含如下命令:4.程序实现方面得要求:(1)、对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误操作情况,程序应该做出相应处理并给出错误信息,但就是程序不得因此而退出。
(2)、界面友好,程序强壮。
(3)、设置界面得提示符,提示得命令以及调试得方法应与前面得要求一致。
不要自己设计命令或者附加不要求得功能。
三、实验源程序文件名:执行文件名:Project1、exe四、实验分析1)总论:该系统就是一个多用户、多任务得实时操作系统。
对用户与用户得文件数目并没有上限。
也就就是说该系统允许任何用户申请空间,而且在其目录下得文件数目并不做任何得限制。
该系统得操作命令如下:①、bye-用户注销命令。
当使用该命令时,用户退出系统。
命令格式:run\bye↙系统注销该用户并回到登陆界面。
②、close-删除用户注册信息命令。
执行该命令后,用户在系统中得所有信息,包括该用户目录下得所有文件都被删除。
命令格式:run\close↙、完成后返回登陆界面。
③、create-在当前目录下创建一个文件,且该文件不能跟系统中得文件重名。
该文件得管理信息登录到用户文件信息管理模块中。
磁盘和文件系统管理(二)实验报告
制作LVM卷的步骤:裸设备---分区---PV---VG---LV---格式化---挂载使用[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc1 建立pv物理卷Physical volume "/dev/sdb1" successfully createdPhysical volume "/dev/sdc1" successfully created[root@localhost ~]# vgcreate hehe /dev/sdb1 /dev/sdc1 建立vg卷组Volume group "hehe" successfully created[root@localhost ~]# lvcreate -L 30G -n xixi hehe 建立lv逻辑卷Logical volume "xixi" created[root@localhost ~]# mkfs.ext3 /dev/hehe/xixi 格式化为ext3的文件系统mke2fs 1.39 (29-May-2006)Filesystem label=OS type: LinuxBlock size=4096 (log=2)Fragment size=4096 (log=2)[root@localhost ~]# mkdir /lvm 创建lvm文件夹[root@localhost ~]# mount /dev/hehe/xixi /lvm 挂载lvm逻辑卷到lvm文件夹下使用[root@localhost ~]# cd /lvm 切换[root@localhost lvm]# ls 查看lost+found[root@localhost lvm]# df -hT 查看磁盘使用情况文件系统类型容量已用可用已用% 挂载点/dev/mapper/VolGroup00-LogVol00ext3 38G 3.1G 33G 9% //dev/sda1 ext3 99M 11M 83M 12% /boottmpfs tmpfs 177M 0 177M 0% /dev/shm/dev/mapper/hehe-xixiext3 30G 173M 28G 1% /lvm[root@localhost lvm]# lvextend -L +3G /dev/hehe/xixi 扩展lvm卷的空间Extending logical volume xixi to 33.00 GBLogical volume xixi successfully resized[root@localhost lvm]# resize2fs /dev/hehe/xixi 重新识别文件系统的大小resize2fs 1.39 (29-May-2006)Filesystem at /dev/hehe/xixi is mounted on /lvm; on-line resizing requiredPerforming an on-line resize of /dev/hehe/xixi to 8650752 (4k) blocks.The filesystem on /dev/hehe/xixi is now 8650752 blocks long.制作磁盘配额的步骤:分区(LVM逻辑卷)---添加配额功能----生成配额文件---编辑配额设置---启动配额功能---验证配额功能---查看使用情况[root@localhost lvm]# mount -o remount,usrquota,grpquota /dev/hehe/xixi /lvm 重新挂载以增加支持配额功能[root@localhost lvm]# mount/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)proc on /proc type proc (rw)sysfs on /sys type sysfs (rw)devpts on /dev/pts type devpts (rw,gid=5,mode=620)/dev/sda1 on /boot type ext3 (rw)tmpfs on /dev/shm type tmpfs (rw)none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)none on /proc/fs/vmblock/mountPoint type vmblock (rw)sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)/dev/mapper/hehe-xixi on /lvm type ext3 (rw,usrquota,grpquota)[root@localhost lvm]# vi /etc/fstab 编辑该文件开机自挂载/dev/hehe/xixi /lvm etx3 defaults,ursquota,grpquota 0 0[root@localhost lvm]# quotacheck -augcv 生成配额文件quotacheck: Scanning /dev/mapper/hehe-xixi [/lvm] quotacheck: Cannot stat old user quota file: 没有那个文件或目录quotacheck: Cannot stat old group quota file: 没有那个文件或目录quotacheck: Cannot s[root@localhost lvm]# cd /lvm 切换[root@localhost lvm]# ls 查看aquota.group er lost+found[root@localhost lvm]# edquota -u gege 为用户gege设置配额/dev/mapper/hehe-xixi 0 80000 10000 0 0 0[root@localhost lvm]# quotaon -ugv /lvm 启用lvm文件系统的磁盘配额功能,并显示命令的执行过程信息/dev/mapper/hehe-xixi [/lvm]: group quotas turned on/dev/mapper/hehe-xixi [/lvm]: user quotas turned on[root@localhost ~]# chmod 777 /lvm 修改lvm文件夹权限[root@localhost ~]# su gege 切换为用户gege[gege@localhost root]$ dd if=/dev/zero of=/lvm/2.txt bs=1M count=8 创建大小为8M的2.txt文件验证是否提示警告dm-2: write failed, user block limit reached.dd: 写入“/lvm/2.txt”: 超出磁盘限额2+0 records in1+0 records out1835008 bytes (1.8 MB) copied, 0.0390995[gege@localhost root]$ quota -u gege 查看用户gege的配额使用情况Disk quotas for user gege (uid 500):Filesystem blocks quota limit grace files quota limit grace/dev/mapper/hehe-xixi10000* 80000 10000 2 0 0。
文件系统管理实训报告
一、实训背景随着信息技术的飞速发展,文件系统作为存储和管理数据的核心,其性能、稳定性和安全性越来越受到重视。
为了提高我们对文件系统管理的理解和实践能力,我们进行了文件系统管理实训。
本次实训以Linux系统下的文件系统管理为主要内容,通过实际操作,加深对文件系统结构、命令、权限管理等方面的认识。
二、实训目标1. 掌握Linux文件系统的基本结构;2. 熟悉常用的文件系统管理命令;3. 理解文件权限和属性的概念;4. 学会文件系统备份与恢复;5. 提高文件系统的安全性和性能。
三、实训内容(一)文件系统结构Linux文件系统采用树状结构,以根目录“/”为起点,所有文件和目录都从根目录开始分层排列。
常见的文件系统结构包括:1. 根目录(/):包含系统中的所有目录和文件;2. 换行目录(/bin、/sbin、/usr):存放常用的系统命令和系统服务;3. 用户目录(/home):存放用户个人文件和目录;4. 临时目录(/tmp):存放临时文件和程序;5. 系统目录(/etc、/var、/opt):存放系统配置文件、日志文件和可选软件包。
(二)文件系统管理命令1. ls:列出目录内容;2. pwd:显示当前目录的绝对路径;3. cd:切换目录;4. mkdir:创建目录;5. rmdir:删除空目录;6. touch:创建空文件;7. rm:删除文件或目录;8. cp:复制文件或目录;9. mv:移动或重命名文件或目录;10. chmod:修改文件权限;11. chown:更改文件所有者;12. chgrp:更改文件所属组。
(三)文件权限和属性Linux文件权限分为三组:所有者、所属组和其他用户。
每组权限包括读(r)、写(w)和执行(x)三种。
通过chmod命令可以修改文件权限,例如:- chmod 755 filename:设置所有者有读、写、执行权限,所属组和其他用户有读、执行权限;- chmod u+x filename:给所有者添加执行权限;- chmod g-w filename:取消所属组的写权限。
文件管理实验报告
文件管理实验报告一、实验目的本次文件管理实验的主要目的是深入了解和掌握文件管理的基本原理和操作方法,通过实际操作和观察,提高对文件系统的认识和运用能力,培养良好的文件管理习惯,以提高工作和学习的效率。
二、实验环境本次实验使用的操作系统为 Windows 10,使用的工具包括资源管理器、命令提示符等。
三、实验内容与步骤(一)文件和文件夹的创建与命名1、打开资源管理器,选择合适的磁盘分区和文件夹。
2、右键单击空白处,选择“新建”,然后分别创建文本文件、Word 文档、文件夹等。
3、为创建的文件和文件夹进行合理的命名,遵循清晰、简洁、有意义的原则,例如“学习资料_数学”“工作周报_202309”等。
(二)文件和文件夹的复制、移动与删除1、选中要操作的文件或文件夹,可以使用鼠标左键单击或按住Ctrl 键进行多选。
2、对于复制操作,右键单击选中的对象,选择“复制”,然后在目标位置右键单击选择“粘贴”。
3、移动操作类似,只是选择“剪切”而不是“复制”。
4、删除文件或文件夹时,选中对象后按下 Delete 键,或者右键单击选择“删除”。
需要注意的是,删除操作是不可逆的,对于重要文件要谨慎操作。
(三)文件和文件夹的属性设置1、右键单击文件或文件夹,选择“属性”。
2、在属性对话框中,可以设置文件的只读、隐藏等属性。
3、了解文件的大小、创建时间、修改时间等信息。
(四)文件的搜索与查找1、在资源管理器的搜索框中输入关键词,如文件名、文件内容中的部分文字等。
2、可以设置搜索范围、搜索条件等,以更精确地找到所需文件。
(五)文件的压缩与解压缩1、选择要压缩的文件或文件夹,右键单击选择“添加到压缩文件”。
2、可以设置压缩格式、压缩级别等参数。
3、对于压缩文件,右键单击选择“解压到当前文件夹”或“解压到指定文件夹”进行解压缩操作。
四、实验中遇到的问题及解决方法(一)问题 1:误删除重要文件在进行删除操作时,不小心删除了一个包含重要数据的文件夹。
04实验四 Windows文件系统查看和管理
实验四Windows文件系统查看和管理【实验目的】1. 掌握Windows XP资源管理器的操作。
2. 掌握文件或文件夹的查看。
3. 掌握文件或文件夹的管理。
4. 掌握文件或文件夹的搜索。
5. 了解磁盘管理工具的使用。
【实验任务】1. 启动资源管理器。
2. 在D盘中建立名为“班级”的文件夹,并在此文件夹中创建A1,A2,A3,A4文件夹。
3. 将“班级”文件夹改名为“会计0601”(或自己班级名称)。
4. 将班级文件夹中的A1,A3复制到“我的文档”。
5. 删除D盘下的A2,A3,A4文件夹,并将A2,A4还原。
6. 将“我的文档”中的A1文件夹发送到软盘中。
7. 查找C盘下所有扩展名为bmp且大于10KB的文件,并拷贝到A4文件夹中。
8. 将A4文件夹中所有小于20KB的文件删除,使其不能被恢复。
9. 对D盘进行磁盘碎片整理。
【实验步骤】1. 启动资源管理器有以下常用方法启动资源管理器:(1) 单击“开始”→“所有程序”→“附件”→“Windows 资源管理器”。
(2) 右击“开始”,在快捷菜单中选择“资源管理器”。
(3) 右击桌面上“我的电脑”、“我的文档”、“回收站”,从快捷菜单中选择“资源管理器”。
在该窗口中,左边的窗格显示了所有磁盘和文件夹的列表,右边的窗格用于显示选定的磁盘和文件夹中的内容。
在左边的窗格中,若驱动器或文件夹前面有“+”号,表明该驱动器或文件夹有下一级子文件夹,单击该“+”号可展开其所包含的子文件夹。
当展开驱动器或文件夹后,“+”号会变成“-”号,表明该驱动器或文件夹已展开,单击“-”号,可折叠已展开的内容。
例如,单击左边窗格中“系统盘”前面的“+”号,将显示C盘中所有的内容。
2. 在D盘中建立名称为“班级”的文件夹,并在此文件夹中创建A1,A2,A3,A4文件夹(1) 打开资源管理器,单击左边的D盘,如图1.4.1所示。
图1.4.1 Windows XP资源管理器(2) 执行菜单命令“文件”→“新建”→“文件夹”,或在右边的文件夹内容窗格中右击空白处,选择“新建”→“文件夹”也可创建文件夹。
操作系统(二)实验报告_上海大学计算机与科学系
操作系统(二)实验报告姓名:米博计算机工程与科学学院实验四 Linux文件系统实验一. 实验目的掌握操作系统中文件分类的概念。
了解Linux文件系统管理文件的基本方式和特点。
学会使用Linux文件系统的命令界面和程序界面的基本要领。
二.实验准备复习操作系统中有关文件系统的知识,熟悉文件的类型、i节点、文件属性、文件系统操作等概念。
熟悉《实验指导》第五部分“文件系统的系统调用”。
了解Linux文件系统的特点、分类。
阅读例程中给出的相应的程序段。
三.实验方法运行命令界面的各命令并观察结果。
用vi编写c程序(假定程序文件名为prog1.c)编译程序$gcc –o prog1.o prog1.c或$cc –o prog1.o prog1.c运行$./prog1.o观察运行结果并讨论。
四.实验内容及步骤1. 用shell命令查看Linux文件类型。
思考:Linux文件类型有哪些?用什么符号表示。
答:文件类型:没有后缀的文件、可执行文件、可读写的文本文件。
.conf —某个程序的配置文件.c — C语言程序源码文件.so —动态链接库文件.tcl — TCL脚本文件.cpp — C++语言程序源码文件.h — C或C++语言的头文件.o —程序对象文件.pl — Perl脚本文件.sh —shell批处理文件2. 用shell命令了解Linux文件系统的目录结构。
执行$ cd /lib$ ls -l|more看看/lib目录的内容,显示的函数都是系统函数。
再看看/etc,这里都是系统设置用的配置文件:/bin中是可执行程序;/home下包括了每个用户主目录。
3. 用命令分别建立硬链接文件和符号链接文件。
通过ls –il命令所示的inode、链接计数观察它们的区别。
找找一个其他目录中的文件,如:/home/zzl/mytese.c执行$ ln /home/zzl/mytest.c myt.c (建立硬链接文件)$ ln –s /home/zzl/mytest.c myt2.c (建立符号链接文件)思考:建立硬链接文件和建立符号链接文件有什么区别,体现在哪里?答:硬链接文件就是给文件取另外一个名字,链接使用inode是与元文件相同的。
实验四 文件管理实验
实验四文件管理实验◆实验名称:文件管理实验◆仪器、设备:计算机◆参考资料:操作系统实验指导书◆实验目的:设计一个n个用户的文件系统,用户在一次运行中只能打开一个文件,有Create、delete、open、close、read、write等命令。
◆实验内容:为DOS系统设计一个简单的二级文件系统。
要求可以实现下列几条命令CREATE 创建文件DELETE 删除文件OPEN 打开文件CLOSE 关闭文件READ 读文件WRITE 写文件◆实验原理、数据(程序)记录:#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/#define MAXCHILD 50 /*the largest child*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/void CreateF() /*Create File*/{int fpaddrno,flag=1,i;char fname[MAXNAME],str[50],str1[50],strtext[255],a[25];char fmode[25];int FindPANo(); /*find out physical address num*/int WriteF1(); /*write file*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0){printf("\nError. You must create file in your own dir.\n");wgetchar=1;}else{ printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));if (ExistF(fname)>=0){printf("\nError. Name \'%s\' has already existed.\n",fname);wgetchar=1;} else{printf("Please input FileMode(0-Read Only, 1-Write Only, 2-Read and Write, 3-Protect):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)||(strcmp(fmode ,"3")==0)){fpaddrno=FindPANo();if (fpaddrno>=0){i=ExistD(username);strcpy(ufd[i]->ufdfile[fcount[i]].fname,fname);ufd[i]->ufdfile[fcount[i]].fpaddr=fpaddrno;ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);ifopen[i][fcount[i]].ifopen=0;ifopen[i][fcount[i]].openmode=4;strcpy(str,"c:\\osfile\\file\\file");itoa(fpaddrno,str1,10);strcat(str,str1);fp_file=fopen(str,"wb");fclose(fp_file);fcount[i]++;while(flag){printf("Input text now(Y/N):");gets(a);ltrim(rtrim(a));ufd[i]->ufdfile[fcount[i]-1].flength=0;if(strcmp(strupr(a),"Y")==0){fp_file=fopen(str,"wb+");ufd[i]->ufdfile[fcount[i]-1].flength=WriteF1();flag=0;} else if(strcmp(strupr(a),"N")==0){flag=0;wgetchar=1;}} printf("\n\'%s\' has been created successfully!\n",fname);} else{printf("\nFail!No Disk Space. Please format your disk.\n");wgetchar=1;}} else {printf("\nError. FileMode\'s Range is 0-3\n");wgetchar=1;}}}}int ExistF(char *filename) /*Whether FileName Exist,Exist-i,Not Exist-0*/{int i,j;int exist=0;int ExistD(char *dirname);j=ExistD(dirname);for(i=0;i<fcount[j];i++)if (strcmp(strupr(ufd[j]->ufdfile[i].fname),strupr(filename))==0){exist=1;break;}if (exist) return(i);else return(-1);}int FindPANo() /*find out physical address num*/{int i;for(i=0;i<MAX;i++)if (fpaddrno[i]==0) {fpaddrno[i]=1;break;}if (i<MAX) return(i);else return(-1);}int WriteF1() /*write file*/{int length=0;char c;printf("Please input text(\'#\' stands for end):\n");while((c=getchar())!='#'){fprintf(fp_file,"%c",c);if (c!='\n') length++;} fprintf(fp_file,"\n");fclose(fp_file);return(length);}******************************************************************************* void DeleteF() /*Delete File*/{char fname[MAXNAME];char str[50],str1[50];int i,j,k,flag=1;char a[25]; /*whether delete*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0){printf("\nError. You can only delete file in your own dir.\n");wgetchar=1;}else{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1){printf("\nError. \'%s\' is in open status. Close it before delete.\n",fname);wgetchar=1;}else{while(flag){printf("\'%s\' will be deleted. Are you sure(Y/N):",fname);gets(a);ltrim(rtrim(a));if(strcmp(strupr(a),"Y")==0){fpaddrno[ufd[k]->ufdfile[i].fpaddr]=0;itoa(ufd[k]->ufdfile[i].fpaddr,str,10);for(j=i;j<fcount[k]-1;j++){strcpy(ufd[k]->ufdfile[j].fname,ufd[k]->ufdfile[j+1].fname);ufd[k]->ufdfile[j].fpaddr=ufd[k]->ufdfile[j+1].fpaddr;ufd[k]->ufdfile[j].flength=ufd[k]->ufdfile[j+1].flength;ufd[k]->ufdfile[j].fmode=ufd[k]->ufdfile[j+1].fmode;ifopen[k][j]=ifopen[k][j+1];}fcount[k]--;strcpy(str1,"c:\\osfile\\file\\file");strcat(str1,str);remove(str1);flag=0;printf("\n\'%s\' has been deleted successfully.\n",fname);wgetchar=1;}else if(strcmp(strupr(a),"N")==0){printf("\nError. \'%s\' hasn\'t been deleted.\n",fname);wgetchar=1;flag=0;}}}}else {printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}******************************************************************************* void OpenF() /*Open File*/{char fname[MAXNAME];char str[25],str1[25],fmode[25];int i,k;char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0){printf("\nError. Please change to ufd dir before open.\n");wgetchar=1;return;}printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(dirname);if(!ifopen[k][i].ifopen){if (ufd[k]->ufdfile[i].fmode==3){printf("\nError. The file\'s mode is FORBID. Can not open.\n");wgetchar=1;}else{printf("Please input FileOpenMode(0-Read Only,1-Write Only,2-Read and Write):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)){if(fmode[0]=='0') /*open file with read only mode*/{strcpy(str,"read only");if((ufd[k]->ufdfile[i].fmode==0)||(ufd[k]->ufdfile[i].fmode==2)) ifopen[k][i].ifopen=1;}else if(fmode[0]=='1') /*open file with write only mode*/{strcpy(str,"write only");if((ufd[k]->ufdfile[i].fmode==1)||(ufd[k]->ufdfile[i].fmode==2)) ifopen[k][i].ifopen=1;}else if(fmode[0]=='2') /*open file with read and write mode*/{strcpy(str,"read and write");if(ufd[k]->ufdfile[i].fmode==2) ifopen[k][i].ifopen=1;}if(ufd[k]->ufdfile[i].fmode==0) strcpy(str1,"read only"); /*FileMode*/else if(ufd[k]->ufdfile[i].fmode==1) strcpy(str1,"write only");else if(ufd[k]->ufdfile[i].fmode==2) strcpy(str1,"read and write");if(ifopen[k][i].ifopen==1){ifopen[k][i].openmode=atoi(fmode);if (ifopen[k][i].openmode==0) strcpy(str,"read only");else if(ifopen[k][i].openmode==1) strcpy(str,"write only");else if(ifopen[k][i].openmode==2) strcpy(str,"read and write");printf("\n\'%s\' has been opened. OpenMode is %s,FileModeis %s\n",fname,strupr(str),strupr(str1));wgetchar=1;} else{printf("\nError. \'%s\' hasn\'t been opened. OpenMode Error. OpenMode is %s,but FileMode is %s\n",fname,strupr(str),strupr(str1));wgetchar=1;}} else {printf("\nError. FileOpenMode\'s Range is 0-2\n");wgetchar=1;}}} else {printf("\nError. \'%s\' is in open status.\n",fname);wgetchar=1;}} else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}******************************************************************************* void CloseF() /*Close File*/{int i,k,n=0;char fname[MAXNAME];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0){printf("\nError. Please convert to ufd dir before close.\n");wgetchar=1;return;}k=ExistD(dirname);printf("\nOpen File(s) In This Ufd:\n"); /*display openned file*/for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1) {printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");} printf("\n%d files openned.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){ifopen[k][i].ifopen=0;ifopen[k][i].openmode=4;printf("\n\'%s\' has been closed successfully.\n",fname);wgetchar=1;} else {printf("\nError.\'%s\' is in closing status.\n",fname);wgetchar=1;}} else {printf("\nError. \'%s\' is not exist.\n",fname);wgetchar=1;}}}******************************************************************************* void ReadF() /*Read File*/{int i,k,n=0;char fname[MAXNAME];char str[255],str1[255],c;char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) {printf("\nError.Please convert to ufd dir before read.\n");wgetchar=1;return;}printf("\nCaution:Open file first\n");printf("Opened File(s) List:\n");k=ExistD(dirname);for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1)if ((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2)){printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files openned.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){if((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2)){itoa(ufd[k]->ufdfile[i].fpaddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"c:\\osfile\\file\\");strcat(str,str1);fp_file=fopen(str,"rb");fseek(fp_file,0,0);printf("\nThe text is:\n\n");printf(" ");while(fscanf(fp_file,"%c",&c)!=EOF)if (c=='\n') printf("\n ");else printf("%c",c);printf("\n\n%d Length.\n",ufd[k]->ufdfile[i].flength);fclose(fp_file);wgetchar=1;}else{printf("\nError.\'%s\' has been opened with WRITE ONLY mode. It isn\'tread.\n",fname);wgetchar=1;}}else {printf("\nError.\'%s\' is in closing status. Please open it beforeread\n",fname);wgetchar=1;}}else {printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}******************************************************************************* void WriteF() /*Write File*/{int i,k,n=0;char fname[MAXNAME];char str[50],str1[50],a[50];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);int WriteF1(); /*write file*/if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) {printf("\nError. Please convert to ufd dir before write.\n");wgetchar=1;return;}k=ExistD(dirname);printf("\nOpen File(s) with write only mode or read and write mode:\n");/*display openned files with writable mode*/for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1)if ((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)){printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files open.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){if((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)){itoa(ufd[k]->ufdfile[i].fpaddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"c:\\osfile\\file\\");strcat(str,str1);if (ufd[k]->ufdfile[i].flength!=0){printf("\n\'%s\' has text. Overwrite or Append(O-overwrite,A-Append,else-not write):",fname);gets(a);ltrim(rtrim(a));if (fp_file!=NULL) fclose(fp_file);if (strcmp(strupr(a),"O")==0){printf("\nOverwrite\n");fp_file=fopen(str,"wb");ufd[k]->ufdfile[i].flength=0;ufd[k]->ufdfile[i].flength=WriteF1();}else if(strcmp(strupr(a),"A")==0){printf("\nAppend\n");fp_file=fopen(str,"ab");ufd[k]->ufdfile[i].flength=ufd[k]->ufdfile[i].flength+WriteF1();}else{printf("\nError.\'%s\' has not been written.\n",fname);fclose(fp_file);wgetchar=1;} }else{fp_file=fopen(str,"wb");ufd[k]->ufdfile[i].flength=WriteF1();}}else{printf("\nError. \'%s\' has been opened with read only mode.It isn\'twrited.\n",fname);wgetchar=1;}}else{printf("\nError. \'%s\' is in closing status. Please open it beforewrite\n",fname);wgetchar=1;}}else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}◆实验结果及分析通过实验实现了有Create、delete、open、close、read、write等命令的简单的文件系统。
实验四文件操作
实验四文件操作一、实验目的1.熟悉和理解文件系统的概念和文件系统的类型。
2.掌握文件系统的挂载方法。
3.学会Linux中数据备份的方法。
4.了解Linux系统中文件系统的管理机制。
二、实验内容1.挂载文件系统。
2.监视文件系统状态。
3.维护文件系统。
4.软盘的使用。
5.硬盘的使用。
6.数据备份和压缩。
7.在GNOME下管理磁盘三、实验环境1.装有Linux系统的计算机。
2.软磁盘和光盘各一张。
四、实验步骤(一)挂载文件系统1.手工挂载文件系统①用mount命令挂载文件系统。
命令格式:mount [-fnrvw] [-t type] device dir其中:-t type:指定文件系统类型;device:待安装文件系统的块设备名;dir:安装点(目录);-f: 模拟一个文件系统的挂装过程,用它可以检查一个文件系统是否可以正确挂装。
-n:挂装一个文件系统,但不在fstab文件中生成与之对应的设置项。
-v:命令进展注释,给出mount命令每个操作步骤的注释。
-r:将文件系统挂载为只读模式;-w:将文件系统挂载为读写模式。
操作:在软驱中插入一张磁盘,然后将软驱挂载为msdos文件类型。
②挂载软磁盘的命令:mount -t msdos /dev/fd0 /mnt/floppy挂载完成后,用ls命令查看软磁盘中包括的文件。
③用mount命令还可以显示所有已安装的文件系统。
命令格式:mount [-hV]2.手工卸载文件系统用umount命令卸载文件系统。
命令格式:umount [-hV]umount [-a] [-n] [-v] [-t types]其中:-h:显示帮助信息。
-V:显示版本信息。
-a:表示要卸载/etc/fstab中的所有文件系统;-n:卸除时不要将信息存入/etc/mtab文件中。
-v:执行时显示详细的信息。
-t types:指定文件系统的类型。
操作:卸载软盘的msdos文件系统。
①命令:umount -t msdos /dev/fd0卸载完成后,从软盘驱动器中取出软盘。
文件管理系统实验报告
文件管理系统实验报告文件管理系统实验报告一、引言文件管理系统是现代社会中不可或缺的一部分。
随着信息技术的迅猛发展,文件的产生和管理变得越来越重要。
本实验旨在通过设计和实现一个简单的文件管理系统,探索文件管理的原理和方法。
二、实验目的1.了解文件管理系统的基本概念和功能;2.掌握文件的创建、读取、修改和删除等操作;3.熟悉文件的组织和存储结构;4.实践文件管理系统的设计和实现。
三、实验内容1.文件的创建和读取在文件管理系统中,文件的创建和读取是最基本的操作。
通过调用系统函数,我们可以创建一个新文件,并向其中写入数据。
而读取文件则是通过指定文件路径和文件名来获取文件的内容。
2.文件的修改和删除文件的修改和删除是文件管理系统中的常见操作。
通过系统函数,我们可以打开一个已有的文件,并对其进行修改。
而删除文件则是通过指定文件路径和文件名来删除一个文件。
3.文件的组织和存储结构文件管理系统中,文件的组织和存储结构对于文件的管理和访问有着重要的影响。
常见的文件组织结构包括顺序文件、索引文件和哈希文件等。
在本实验中,我们将选择适合的文件组织结构,并实现相应的存储和检索算法。
四、实验步骤1.设计文件管理系统的数据结构在开始实验之前,我们需要先设计文件管理系统的数据结构。
这包括文件控制块(FCB)、目录项(Directory Entry)和文件块(File Block)等。
通过合理的数据结构设计,可以提高文件管理系统的性能和效率。
2.实现文件的创建和读取功能根据文件管理系统的设计,我们可以开始实现文件的创建和读取功能。
通过调用系统函数,我们可以创建一个新的文件,并向其中写入数据。
而读取文件则是通过指定文件路径和文件名来获取文件的内容。
3.实现文件的修改和删除功能文件的修改和删除是文件管理系统中的常见操作。
通过调用系统函数,我们可以打开一个已有的文件,并对其进行修改。
而删除文件则是通过指定文件路径和文件名来删除一个文件。
实验四 磁盘和文件系统管理心得
实验四磁盘和文件系统管理心得
实验四磁盘和文件系统管理心得
在本次实验中,我们学习了磁盘和文件系统的管理。
通过实验,我对磁盘和文件系统的概念及其管理方式有了更深入的了解和体验。
首先,磁盘管理是操作系统最基本的功能之一。
磁盘是计算机存储信息的主要设备,因此,对磁盘的管理显得尤为重要。
在实验中,我了解了磁盘的分区和格式化两个重要操作。
分区可以将一个大磁盘划分为多个逻辑分区,方便对不同的数据进行管理。
而格式化则是将分区或整个磁盘进行数据擦除,以便重新存储数据。
此外,我还学习了磁盘空间的管理,包括磁盘空间的容量、使用情况等,这些都是磁盘管理的重要内容。
其次,文件系统管理也是操作系统的重要功能之一。
文件系统是指计算机用来管理文件的一组规则和程序。
在实验中,我学习和掌握了文件的基本操作,如文件的创建、删除、拷贝和移动等。
同时,我还学习了文件系统的组成和结构,包括目录、文件描述符和索引节点等。
这些知识对文件系统的管理非常有帮助。
总之,通过本次实验,我深入了解了磁盘和文件系统的管理方式,掌握了它们的基本操作和原理,并且实践了相关操作。
这些知识对我今
后的计算机学习和工作都将有帮助。
实验4:文件系统管理与使用
实验4:Linux文件系统管理1、实验目的(1)掌握UNIX系统的文件系统结构及特点;(2)掌握Linux系统的目录结构和文件及目录管理命令;(3)掌握UNIX系统的存储设备和文件系统使用方法;(4)了解文件系统清理与同步。
2、实现设备一台装有Windows操作系统PC机,上装有虚拟机系统VMWare,实验过程通过VMWare 系统启Linux系统工作。
3、实验方法与注意事项实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。
要求每个同学登录后系统后,要在自己的家目录内容以自己(拼音)名字或学号,创建一个子目录(已有者可以不再创建)。
以后所有工作都要在自己的目录内进行。
建议以后的实验都在同台计算机上做,这样可以保持连续性。
用户要按通常实验要认真书写实验报告。
4、实验过程(1)目录操作在当前目录下创建一个子目录,对其进行相应,然后再删除它(要求每步都要使用ls 命令观察结果):a. 创建目录:mkdir dir1 dir2b. 复制文件或目录:cp -r /etc/rc.d dir1c. 复制文件或目录:cp -r /etc/rc.d dir3d. 删除目录(方法1):rmdir dir1 dir2e. 删除目录(方法2):rm –rf dir1f. 观察dir3的内容后,删除之。
(2)文件的硬链接与符号链接创建一个文件myfile和一个目录mydir,分别为myfile创建一个硬链接和一个符号链接:ln myfile /tmp/myfile; ln -s myfile /tmp/myfile1ln -s mydir /tmp/myd使用ls命令查看结果。
(3)文件查找说明:如果查找的文件不存在,可以事先创建之,以供实验之用。
a. 在目录/tmp和/home下查找24小时内没有更改的文件。
find /tmp /home –mtime –1 –printb. 在/home下查找属于用户gjshao的c语言程序文件。
实验 文件管理(二)
实验六:文件系统一、目的要求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<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>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;i<num;i++){printf("用户:%s 目录如下!\n",filesystem[i].username);p=filesystem[i].link;while(p){ printf("\t文件名: %s\t||",p->filename);printf("文件属性: %s\t||",p->procode);printf("文件长度: %d\n\n",p->length);p=p->nextfile;}}}void input() /*建立用户文件系统*/{ int i,j;int length;char filename[10];char procode[4];UFD *p1,*p2,*first;for(i=0;i<10;i++)filesystem[i].link=NULL;printf("用户号码:\n");scanf("%d",&num);for(i=0;i<num;i++)/*输入各用户名称*/{printf("输入第%d个用户名:\n",i+1);scanf("%s",filesystem[i].username);}for(i=0;i<num;i++)/*输入某用户的文件数据*/{j=1;printf(" 第%d个用户的文件如下\n",i+1);printf("文件%d:\n",j);printf("长度:");scanf("%d",&length);if(!length)continue;printf("文件名:");scanf("%s",filename);printf("文件属性(100只读,110读写,001可执行)");scanf("%s",procode);first=(UFD*)malloc(sizeof(UFD));first->nextfile=NULL;strcpy(first->filename,filename);strcpy(first->procode,procode);first->length=length;p1=p2=first;j++;while(1){printf("文件%d:\n",j);printf("长度:");scanf("%d",&length);if(!length)break;printf("文件名:");scanf("%s",filename);printf("属性(100只读,110读写,001可执行):");scanf("%s",procode);p2=(UFD*)malloc(sizeof(UFD));p2->nextfile=NULL;strcpy(p2->filename,filename);strcpy(p2->procode,procode);p2->length=length;j++;p1->nextfile=p2;p1=p1->nextfile; }filesystem[i].link=first; }displayallfile();}int findusername(char * username)/*返回用户名下标,当I=NUM时,用户不存在*/ { int i;i=0;while(i<num){if(!strcmp(filesystem[i].username ,username))break;i++;}return i;}UFD * findfilename(char *filename,UFD *filepointer){UFD *k;k=filepointer;while(k&&strcmp(filename,k->filename))k=k->nextfile;return k;}void displayfile(UFD *link){ UFD *p;p=link;if(!p){printf("\n此目录没有该文件!");return;}printf("\n用户文件如下:\n");while(p){printf("%s\t||",p->filename);printf("%s\t||",p->procode);printf("%d\n\n",p->length);p=p->nextfile;}}void createfile(){ char username[10];char filename[10];int i;UFD *p1,*p2,*newfile;if(num>=10)/*用户文件目录已满,创建文件失败*/{printf("用户文件目录已满\n创建文件失败!\n");return;}printf("输入用户名:\n");scanf("%s",username);i=findusername(username);/*返回用户名下标*/if(i==num)/*如果该用户不存在,且用户个数不小于10,先创建用户再建立用户文件*/{printf("用户不存在,请建立用户!\n");strcpy(filesystem[num].username ,username);/*创建用户目录*/num++;{newfile =(UFD *)malloc(sizeof(UFD));newfile->nextfile=NULL;filesystem[num-1].link=newfile;printf("文件名:");scanf("%s",filesystem[num-1].link->filename);printf("\n属性:");scanf("%s",filesystem[num-1].link->procode);printf("\n长度:");scanf("%d",&(filesystem[num-1].link->length));printf("\n文件已创建!\n");}}else/*为已存在的用户建立文件*/{p1=p2=filesystem[i].link ;printf("输入文件名:");scanf("%s",filename);while(p2){ if (!strcmp(p2->filename,filename)){ printf("文件名已存在,请输入新文件名!\n");scanf("%s",filename); }p1=p2;p2=p2->nextfile;}newfile=(UFD *)malloc(sizeof(UFD));newfile->nextfile=NULL;strcpy(newfile->filename,filename);printf("\n属性:");scanf("%s",newfile->procode);printf("\n长度:");scanf("%d",&(newfile->length));p1->nextfile=newfile;//printf("\n文件已创建!\n");}displayallfile();}void displayuser()/*显示用户目录*/{int i;if(num<=0)return;printf("\n用户目录如下! ");for(i=0;i<num;i++);printf("\n%s",filesystem[i].username);}void deletefile() /*删除文件*/{ int i;char username[10];char filename[10];UFD *p1,*p2;printf("\n输入用户名:\n");scanf("%s",username);i=findusername(username);//返回用户名下标if(i>=num){printf("用户不存在!\n删除失败!");return ;}else{printf("\n输入文件名:");scanf("%s",filename);p1=p2=filesystem[i].link;while(p2&&strcmp(p2->filename,filename)){p1=p2;p2=p2->nextfile;}if(!p2)printf("\n文件不存在!\n删除失败!\n");else{if(p1==p2)filesystem[i].link=p1->nextfile;elsep1->nextfile=p2->nextfile;delete(p2);printf("文件已删除!\n");}}displayallfile();}AFD * openfile(){ char username[10];char filename[10];int i;UFD *p=NULL;AFD *k=NULL;/*为打开的文件设置了运行文件目录*/ printf("输入用户名:\n");scanf("%s",username);i=findusername(username);/*返回用户名下标*/if(i>=num){printf("\n用户不存在!\n不能打开文件!\n");return NULL;}else/*用户存在*/{printf("\n输入文件名:");scanf("%s",filename);p=findfilename(filename,filesystem[i].link);if(!p)/*用户文件不存在*/{printf("\n文件不存在!\n");return NULL;}else{afd=(AFD *)malloc(sizeof(AFD));strcpy(afd->filename,p->filename);strcpy(afd->procode,p->procode);afd->rwpointer=0;printf("\n文件已打开!\n");rw_pointer=p;/*为了读文件保留指针*/printf("\t文件目录AFD:\n"); /*打开运行文件目录AFD*/ printf("\t文件名: %s\n",afd->filename);printf("\t属性: %s\n",afd->procode);printf("\t读写指针: %d\n",afd->rwpointer); }}return afd; }void closefile(){ if(!afd){printf("\n没有文件打开!\n");return; }delete(afd);afd=NULL;printf("\n文件已关闭!\n");}void readfile()//{AFD *p;p=openfile();if(!p)return;if(strcmp(p->procode,"100")&&strcmp(p->procode,"110")) printf("\nfile:%s 文件不可读!\n",p->filename);/*操作*/ else{printf("已读取文件!\n");printf("\t文件名:%s\n",p->filename);printf("\t属性:%s\n",p->procode);printf("\t读写指针:%d\n",rand()%rw_pointer->length); }closefile();/*关闭文件*/}void writefile(){AFD *p;/*运行文件目录*/UFD *k;p=openfile();k=rw_pointer;if(!p)return;if(strcmp(p->procode,"110")){printf("\nfile:%s 该文件不能写!\n",p->filename);return; }else{ p->rwpointer=rand()%k->length;k->length=p->rwpointer ;/*修改读书指针写回文件*/}printf("\n已完成写操作!\n");printf("\t文件名: %s\n",k->filename);printf("\t属性: %s\n",k->procode);printf("\t长度: %d\n",k->length);closefile();}void executefile(){AFD *p;p=openfile();if(!p){printf("\n文件不存在!\n");return;}if(strcmp(p->procode,"001")){printf("\n该文件不能执行!\n");printf("\n文件属性为不可执行文件!\n");return;}else{closefile();printf("\n文件执行完毕!"); }}void menu(){printf("------------------------------------------------------------------------------\n");printf(" <文件管理> \n");printf("------------------------------------------------------------------------------\n");printf(" MENU :\n");printf("\t\tmenu----------显示菜单\n");printf("\t\topen----------打开文件\n");printf("\t\tclose---------关闭文件\n");printf("\t\tcreate--------创建文件\n");printf("\t\tread----------读文件\n");printf("\t\twrite---------写文件\n");printf("\t\texecute-------执行文件\n");printf("\t\tdelete--------删除文件\n");printf("\t\tdisplay--------显示文件列表\n");printf("\t\texit--------退出\n");printf("\t注意:输入时当文件长度为0时表示该用户的文件输入结束!\n"); printf("------------------------------------------------------------------------------\n");}void fileoperation()/*文件基本操作*/{char str[10];int sort;while(1){printf("输入命令:\n");printf(">>");scanf("%s",str);if(!strcmp(str,"create"))sort=1;elseif(!strcmp(str,"delete"))sort=2;elseif(!strcmp(str,"read"))sort=3;elseif(!strcmp(str,"write"))sort=4;elseif(!strcmp(str,"execute"))sort=5;elseif(!strcmp(str,"open"))sort=6;elseif(!strcmp(str,"close"))sort=7;elseif(!strcmp(str,"menu"))sort=8;elseif(!strcmp(str,"display"))sort=9;elseif(!strcmp(str,"exit"))sort=10;elsesort=0;switch(sort){case 1:createfile();break;case 2:deletefile();break;case 3:readfile();break;case 4:writefile();break;case 5:executefile();break;case 6:openfile();break;case 7:closefile();break;case 8:menu();break;case 9: displayallfile();break;case 10: return;default:break; }}}void main(){ menu();input();fileoperation();}。
实验四文件系统实验
实验四文件系统实验1)掌握文件系统的工作机理。
2)理解文件系统的主要数据结构。
3)学习较为复杂的LINU某下的编程实验内容设计并实现一个一级(单用户)文件系统程序a.提供以下操作:文件创建/删除接口命令create/delete目录创建/删除接口命令mkdir/rmdir显示目录内容命令lb.创建的文件不要求格式和内容2)设计并实现一个二级文件系统程序a.提供用户登录;b.文件、目录要有权限实验结果及其解释说明基本上实现了简单文件系统的实现。
创建并读写文件如下图所示:打开文件、关闭文件、创建并显示子目录、删除子目录如下图所示:实验中的问题及解决首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都应以文件的形式存放于磁盘,这样便于查找和修改。
由于对文件系统理解不够深刻,导致程序在一些原理上的迷糊不清,而时间较短,因此采取了简化的方法。
在写程序的开始也没有做详细的规划,因此在程序的结构上有些混乱。
在后期做了一些调整,但是整体还是有缺陷的。
另外程序只是很简单的实现了文件管理系统,只有一些非常简单的功能,而且功能考虑的也不尽全面、严谨,难免会出现一些Bug。
必须对写好的程序进行反复的调试和优化。
实验体会程序清单#include#include#include#defineDIR_LENGTH1024/某路径最长可达100字节某/#defineMA某_WRITE1024某128/某写入文字可达128k字节某/#defineMEM_D_SIZE1024某1024/某1M磁盘空间某/#defineDISKSIZE1024/某磁盘快的大小1K某/#defineMSD5/某最大子目录数5(类似五叉树)某/#defineDISK_NUMMEM_D_SIZE/DISKSIZE/某磁盘快数目1024=1M/1K某/#defineFATSIZEDISK_NUM某izeof(tructfatitem)/某FAT表大小8K=8192B(理想应该是1.5K)某/#defineMOFN5/某最大文件打开数5(即除根以外最大深度为5)某/#defineROOT_DISK_NOFATSIZE/DISKSIZE+1/某根目录起始盘快号9某/#defineROOT_DISK_SIZEizeof(tructdirect)/某根目录大小196某/ /某---------------FAT表项结构-----------------------某/tructfatitem/某ize8某/{intitem;/某存放文件下一个磁盘的指针某/charem_dik;/某磁盘块是否空闲标志位0空闲某/};/某-------------------目录项结构------------------------某/tructdirect/某ize196某/{/某-----文件控制快信息-----某/tructFCB{charname[9];/某文件/目录名8位某/charproperty;/某属性1位目录0位普通文件某/intize;/某文件/目录字节数(原注释位盘块数)某/intfirtdik;/某文件/目录起始盘块号某/intne某t;/某子目录起始盘块号某/intign;/某1是根目录0不是根目录某/}directitem[MSD+2];};/某------------------文件打开表项结构--------------------------某/tructopentable/某ize104某/{tructopenttableitem/某ize20某/{charname[9];/某文件名某/intfirtdik;/某起始盘块号某/intize;/某文件的大小某/}openitem[MOFN];intcur_ize;/某当前打文件的数目某/};/某-------------------------------------------------------------------某/tructfatitem某fat;/某FAT表某/tructdirect某root;/某根目录某/tructdirect某cur_dir;/某当前目录某/tructopentableu_opentable;/某文件打开表某/intfd=-1;/某文件打开表的序号某/char某bufferdir;/某记录当前路径的名称某/char某fdik;/某虚拟磁盘起始地址某/voidinitfile();voidformat();voidenter();voidhalt();intcreate(char某name);intopen(char某name);intcloe(char某name);intwrite(intfd,char某buf,intlen);intread(intfd,char某buf);intdel(char某name);intmkdir(char某name);intrmdir(char某name);voiddir();intcd(char某name);voidprint();voidhow();/某----------------------------------------------------------------------------------------------某//某------------------------------------------初始化文件系统--------------------------------------某/voidinitfile(){ fdik=(char某)malloc(MEM_D_SIZE某izeof(char));/某申请1M空间某/format();free(fdik);}/某----------------------------------------------------------------------------------------------某//某------------------------------------------格式化----------------------------------------------某/voidformat(){inti;FILE某fp;fat=(tructfatitem某)(fdik+DISKSIZE);/某计算FAT表地址(为什么向后偏移1k)某//某-----初始化FAT表------------某/fat[0].item=-1;/某引导块某/fat[0].em_dik='1';for(i=1;ifat[i].item=i+1;fat[i].em_dik='1';}fat[ROOT_DISK_NO-1].item=-1;fat[ROOT_DISK_NO-1].em_dik='1';fat[ROOT_DISK_NO].item=-1;/某存放根目录的磁盘块号某/fat[ROOT_DISK_NO].em_dik='1';for(i=ROOT_DISK_NO+1;ifat[i].item=-1;fat[i].em_dik='0';}/某-----------------------------------------------某/root=(tructdirect某)(fdik+DISKSIZE+FATSIZE);/某根目录的地址某//某初始化目录某//某---------指向当前目录的目录项---------某/root->directitem[0].ign=1;root->directitem[0].firtdik=ROOT_DISK_NO;trcpy(root->directitem[0].name,\root->directitem[0].ne某t=root->directitem[0].firtdik;root->directitem[0].property='1';root->directitem[0].ize=ROOT_DISK_SIZE;/某-------指向上一级目录的目录项---------某/root->directitem[1].ign=1;root->directitem[1].firtdik=ROOT_DISK_NO;trcpy(root->directitem[1].name,\root->directitem[1].ne某t=root->directitem[0].firtdik;root->directitem[1].property='1';root->directitem[1].ize=ROOT_DISK_SIZE;for(i=2;iroot->directitem[i].ign=0;root->directitem[i].firtdik=-1;trcpy(root->directitem[i].name,\root->directitem[i].ne某t=-1;root->directitem[i].property='0';root->directitem[i].ize=0;} if((fp=fopen(\{printf(\return;}if(fwrite(fdik,MEM_D_SIZE,1,fp)!=1)/某把虚拟磁盘空间保存到磁盘文件中某/{printf(\}fcloe(fp);}/某----------------------------------------------------------------------------------------------某//某--------------------------------进入文件系统--------------------------------------------------某/voidenter(){FILE某fp;inti;fdik=(char某)malloc(MEM_D_SIZE某izeof(char));/某申请1M空间某/if((fp=fopen(\{printf(\return;}if(!fread(fdik,MEM_D_SIZE,1,fp))/某把磁盘文件dik.dat读入虚拟磁盘空间(内存)某/{printf(\e某it(0);}fat=(tructfatitem某)(fdik+DISKSIZE);/某找到FAT表地址某/root=(tructdirect某)(fdik+DISKSIZE+FATSIZE);/某找到根目录地址某/fcloe(fp);/某--------------初始化用户打开表------------------某/for(i=0;itrcpy(u_opentable.openitem[i].name,\u_opentable.openitem[i]. firtdik=-1;u_opentable.openitem[i].ize=0;}u_opentable.cur_ize=0;cur_dir=root;/某当前目录为根目录某/bufferdir=(char某)malloc(DIR_LENGTH某izeof(char));trcpy(bufferdir,\显示根目录为E:某/}-------------------------------------某//某------------------------------------退出文件系统----------------------------------------------某/voidhalt(){FILE某fp;inti;if((fp=fopen(\{printf(\return;}if(!fwrite(fdik,MEM_D_SIZE,1,fp))/某把虚拟磁盘空间(内存)内容读入磁盘文件dik.dat某/{printf(\}fcloe(fp);free(fdik);free(bufferdir);for(i=0;itrcpy(u_opentable.openitem[i].name,\u_opentable.openitem[i]. firtdik=0;u_opentable.openitem[i].ize=0;}u_opentable.cur_ize=0;/某用户打开文件数清零某/return;}-------------------------------------某//某----------------------------------------创建文件----------------------------------------------某/intcreate(char某name){inti,j;if(trlen(name)>8)/某文件名大于8位某/return(-1);for(i=2;iif(cur_dir->directitem[i].firtdik==-1)break;}for(j=2;j{if(!trcmp(cur_dir->directitem[j].name,name))break;}if(i>=MSD+2)/某无空目录项某/return(-2);if(u_opentable.cur_ize>=MOFN)/某打开文件太多(第五层)某/return(-3);if(jfor(j=ROOT_DISK_NO+1;jif(fat[j].em_dik=='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_dik='1';/某将空闲块置为已经分配某//某-----------填写目录项-----------------某/trcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firtdik=j;cur_dir->directitem[i].ize=0;cur_dir->directitem[i].ne某t=j;cur_dir->directitem[i].property='0';/某cur_dir->directitem[i].ign丢失某//某---------------------------------某/fd=open(name);/某打开所创建的文件某/return0;}/某----------------------------------------------------------------------------------------------某//某----------------------------------------打开文件----------------------------------------------某/intopen(char某name){inti,j;for(i=2;iif(!trcmp(cur_dir->directitem[i].name,name))break;}if(i>=MSD+2)/某文件不存在某/return(-1);/某--------是文件还是目录-----------------------某/if(cur_dir->directitem[i].property=='1')/某是目录,不可打开读写某/return(-4);/某--------文件是否打开-----------------------某/for(j=0;j if(!trcmp(u_opentable.openitem[j].name,name))break;}if(jif(u_opentable.cur_ize>=MOFN)/某文件打开太多某/return(-3);/某--------查找一个空闲用户打开表项-----------------------某/for(j=0;jif(u_opentable.openitem[j].firtdik==-1)break;}/某--------------填写表项的相关信息------------------------某/u_opentable.openitem[j].firtdik=cur_dir->directitem[i].firtdik;trcpy(u_opentable.openitem[j].name,name);u_opentable.openitem[j].ize=cur_dir->directitem[i].ize;u_opentable.cur_ize++;/某----------返回用户打开表表项的序号--------------------------某/return(j);}/某----------------------------------------------------------------------------------------------某//某----------------------------------------关闭文件----------------------------------------------某/intcloe(char某name){inti;for(i=0;i{if(!trcmp(u_opentable.openitem[i].name,name))break;}if(i>=MOFN)/某--文件没有打开-某/return(-1);/某-----------清空该文件的用户打开表项的内容---------------------某/trcpy(u_opentable.openitem[i].name,\u_opentable.openitem[i].fir tdik=-1;u_opentable.openitem[i].ize=0;u_opentable.cur_ize--;fd=-1;/某文件打开表的序号为-1某/return0;}/某----------------------------------------------------------------------------------------------某//某----------------------------------------写文件------------------------------------------------某/intwrite(intfd,char某buf,intlen){char某firt;intitem,i,j,k;intilen1,ilen2,modlen,temp;/某----------用$字符作为空格#字符作为换行符-----------------------某/charSpace=32;/某SPACE的ASCII码值某/charEndter='\\n';for(i=0;iif(buf[i]=='$')/某用$字符作为空格某/buf[i]=Space;eleif(buf[i]=='#')buf[i]=Endter;}/某----------读取用户打开表对应表项第一个盘块号-----------------------某/item=u_opentable.openitem[fd].firtdik;/某-------------找到当前目录所对应表项的序号-------------------------某/for(i=2;iif(cur_dir->directitem[i].firtdik==item)break;}temp=i;/某-存放当前目录项的下标-某//某------找到的item是该文件的最后一块磁盘块-------------------某/while(fat[item].item!=-1){item=fat[item].item;/某-查找该文件的下一盘块--某/}/某-----计算除该文件的最末地址-------某/firt=fdik+item某DISKSIZE+u_opentable.openitem[fd].ize%DISKSIZE;/某-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------某/if(DISKSIZE-u_opentable.openitem[fd].ize%DISKSIZE>len){ trcpy(firt,buf);u_opentable.openitem[fd].ize=u_opentable.openitem[fd].ize+le n;cur_dir->directitem[temp].ize=cur_dir->directitem[temp].ize+len;}ele{for(i=0;i/某-----计算分配完最后一块磁盘的剩余空间(字节)还剩下多少字节未存储-------某/ilen1=len-(DISKSIZE-u_opentable.openitem[fd].ize%DISKSIZE);ilen2=ilen1/DISKSIZE;modl en=ilen1%DISKSIZE;if(modlen>0)ilen2=ilen2+1;/某--还需要多少块磁盘块-某//某调试时特别注意某/for(j=0;jfor(i=ROOT_DISK_NO+1;iif(fat[i].em_dik=='0')break;}if(i>=DISK_NUM)/某--如果磁盘块已经分配完了-某/return(-1);firt=fdik+i某DISKSIZE;/某--找到的那块空闲磁盘块的起始地址-某/if(j==ilen2-1)/某--如果是最后要分配的一块-某/{for(k=0;kele/某-如果不是要最后分配的一块--某/{for(k=0;kfat[item].item=i;/某--找到一块后将它的序号存放在上一块的指针中-某/fat[i].em_dik='1';/某--置找到的磁盘快的空闲标志位为已分配-某/fat[i].item=-1;/某--它的指针为-1(即没有下一块)-某/} /某--修改文件打开表用户的长度-某/u_opentable.openitem[fd].ize=u_opentable.openitem[fd].ize+le n;/某--修改目录项的文件长度-某/cur_dir->directitem[temp].ize=cur_dir->directitem[temp].ize+len;}return0;}/某----------------------------------------------------------------------------------------------某//某----------------------------------------读文件------------------------------------------------某/intread(intfd,char某buf){intlen=u_opentable.openitem[fd].ize;char某firt;inti,j,item;intilen1,modlen;item=u_opentable.openitem[fd].firtdik;if(len>u_opentable.openitem[fd].ize)/某--欲读出的文件长度比实际文件长度长-某/return(-1);ilen1=len/DISKSIZE;modlen=len%DISKSIZE;if(modlen!=0)ilen1=ilen1+1;/某--计算文件所占磁盘的块数-某/firt=fdik+item某DISKSIZE;/某--计算文件的起始位置-某/for(i=0;i{if(i==ilen1-1)/某--如果在最后一个磁盘块-某/{for(j=0;jele/某--不在最后一块磁盘块-某/{for(j=0;jitem=fat[item].item;/某-查找下一盘块-某/firt=fdik+item某DISKSIZE;}}return0;}/某----------------------------------------------------------------------------------------------某//某----------------------------------------删除文件----------------------------------------------某/intdel(char某name){inti,cur_item,item,temp;for(i=2;iif(!trcmp(cur_dir->directitem[i].name,name))break;}cur_item=i;/某--用来保存目录项的序号,供释放目录中-某/if(i>=MSD+2)/某--如果不在当前目录中-某/return(-1);if(cur_dir->directitem[cur_item].property!='0')/某--如果删除的(不)是目录-某/return(-3);for(i=0;iif(!trcmp(u_opentable.openitem[i].name,name))return(-2);}item=cur_dir->directitem[cur_item].firtdik;/某--该文件的起始盘块号-某/while(item!=-1)/某--释放空间,将FAT表对应项进行修改-某/{temp=fat[item].item;fat[item].item=-1;fat[item].em_dik='0';item=temp;}/某-----------------释放目录项-----------------------某/cur_dir->directitem[cur_item].ign=0;cur_dir->directitem[cur_item].firtdik=-1;trcpy(u_opentable.openitem[cur_item].name,\cur_dir->directitem[cur_item].ne某t=-1;cur_dir->directitem[cur_item].property='0';cur_dir->directitem[cur_item].ize=0;return0;}/某----------------------------------------------------------------------------------------------某//某---------------------------------------创建子目录---------------------------------------------某/intmkdir(char某name){inti,j;tructdirect某cur_mkdir;if(trchr(name,'\\\\'))/某如果目录名中有'\\'字符某/return(-4);if(!trcmp(name,\return(-6);if(!trcmp(name,\return(-6);if(trlen(name)>8)/某-如果目录名长度大于8位-某/return(-1);for(i=2;iif(cur_dir->directitem[i].firtdik==-1)break;}if(i>=MSD+2)/某-目录/文件已满-某/return(-2);for(j=2;jif(!trcmp(cur_dir->directitem[j].name,name))break;}if(jfor(j=ROOT_DISK_NO+1;jif(fat[j].em_dik=='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_dik='1';/某-将该空闲块设置为已分配-某//某-------------填写目录项----------某/trcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firtdik=j;cur_dir->directitem[i].ize=ROOT_DISK_SIZE;cur_dir->directitem[i].ne某t=j;/某-指向子目录(其实就是其本身)的起始盘块号-某/cur_dir->directitem[i].property='1';/某-ign=1为根标志,这里可以省略-某//某-所创目录在虚拟磁盘上的地址(内存物理地址)-某/cur_mkdir=(tructdirect某)(fdik+cur_dir->directitem[i].firtdik某DISKSIZE);/某-初始化目录-某//某-指向当前目录的目录项-某/cur_mkdir->directitem[0].ign=0;cur_mkdir->directitem[0].firtdik=cur_dir->directitem[i].firtdik;trcpy(cur_mkdir->directitem[0].name,\ cur_mkdir->directitem[0].ne某t=cur_mkdir->directitem[0].firtdik;cur_mkdir->directitem[0].property='1';cur_mkdir->directitem[0].ize=ROOT_DISK_SIZE;/某-指向上一级目录的目录项-某/cur_mkdir->directitem[1].ign=cur_dir->directitem[0].ign;/某-指向上一级目录的目录项-某/cur_mkdir->directitem[1].firtdik=cur_dir->directitem[0].firtdik;trcpy(cur_mkdir->directitem[1].name,\ cur_mkdir->directitem[1].ne某t=cur_mkdir->directitem[1].firtdik;cur_mkdir->directitem[1].property='1';cur_mkdir->directitem[1].ize=ROOT_DISK_SIZE;for(i=2;icur_mkdir->directitem[i].ign=0;cur_mkdir->directitem[i].firtdik=-1;trcpy(cur_mkdir->directitem[i].name,\cur_mkdir->directitem[i].ne某t=-1;cur_mkdir->directitem[i].property='0';cur_mkdir->directitem[i].ize=0;} return0;}/某----------------------------------------------------------------------------------------------某//某---------------------------------------删除子目录---------------------------------------------某/intrmdir(char某name){inti,j,item;tructdirect某temp_dir;/某-检查当前目录项中有无该目录-某/for(i=2;iif(!trcmp(cur_dir->directitem[i].name,name))break;}if(cur_dir->directitem[i].property!='1')/某-删除的不是目录-某/return(-3);if(i>=MSD+2)/某-没有这个文件或目录-某/return(-1);/某-判断要删除的目录有无子目录-某//某-要删除的目录起始地址-某/temp_dir=(tructdirect某)(fdik+cur_dir->directitem[i].ne某t 某DISKSIZE);for(j=2;jif(temp_dir->directitem[j].ne某t!=-1)break;}if(jreturn(-2);/某-有关联则报错,也可以采取级联删除,像Window-某//某------------找到起始盘块号,并将其释放----------------某/item=cur_dir->directitem[i].firtdik;fat[item].em_dik='0';/某-修改目录项-某/cur_dir->directitem[i].ign=0;cur_dir->directitem[i].firtdik=-1;trcpy(cur_dir->directitem[i].name,\cur_dir->directitem[i].ne某t=-1;cur_dir->directitem[i].property='0';cur_dir->directitem[i].ize=0;return0;}/某----------------------------------------------------------------------------------------------某//某-------------------------------显示当前目录的子目录-------------------------------------------某/voiddir(){inti;for(i=0;iif(cur_dir->directitem[i].firtdik!=-1)/某-如果存在子目录-某/{/某-其本身和父目录也算-某/printf(\if(cur_dir->directitem[i].property=='0')/某-文件-某/printf(\ele/某-目录-某/printf(\}}}/某----------------------------------------------------------------------------------------------某//某---------------------------------------更改当前目录-------------------------------------------某/intcd(char某name){inti,j,item;char某tr,某tr1;char某temp,某point,某point1;tructdirect某temp_dir;temp_dir=cur_dir;/某-先用临时目录代替当前目录-某/tr=name;/某-tr用来记录下次查找的起始地址-某/if(!trcmp(\如果输入\回根目录某/{cur_dir=root;trcpy(bufferdir,\return0;}j=0;for(i=0;iif(name[i]=='\\\\'){j++;if(j>=2){return-3;}}elej=0;}if(name[0]=='\\\\')/某如果最后一个是\去掉这个\{temp_dir=root;trcpy(bufferdir,\tr++;}if(tr[trlen(tr)-1]=='\\\\'){tr[trlen(tr)-1]='\\0';}tr1=trchr(tr,'\\\\');/某-找到'\\'字符的位置-某/temp=(char某)malloc(DIR_LENGTH某izeof(char));/某-为子目录的名字分配空间-某/while(tr1!=NULL)/某-找到-某/{for(i=0;itemp[i]=tr[i];}temp[i]='\\0';for(j=2;jif(!trcmp(temp_dir->directitem[j].name,temp))break;}if(j>=MSD+2)/某-不在当前目录-某/return(-1);item=temp_dir->directitem[j].firtdik;temp_dir=(tructdirect某)(fdik+item某DISKSIZE);/某-计算当前目录物理位置-某/tr=tr1+1;tr1=trchr(tr,'\\\\');//free(temp);}tr1=tr1+trlen(tr);for(i=0;ifor(j=0;jif(!trcmp(temp_dir->directitem[j].name,temp))break;}free(temp);/某释放申请的临时空间某/if(temp_dir->directitem[j].property!='1')/某-打开的不是目录-某/return(-2);if(j>=MSD+2)/某-不在当前目录-某/return(-1);item=temp_dir->directitem[j].firtdik;/某-当前目录在磁盘中位置-某/temp_dir=(tructdirect某)(fdik+item某DISKSIZE);if(!trcmp(\{if(cur_dir->directitem[j-1].ign!=1)/某-如果子目录不是根目录-某/{point=trchr(bufferdir,'\\\\');while(point!=NULL){point1=point+1;/某-减去'\\'所占的空间,记录下次查找的起始地址-某/point=trchr(point1,'\\\\');}某(point1-1)='\\0';/某-将上一级目录删除-某/}ele{}}eleif(!trcmp(\{bufferdir=bufferdir;/某-如果是当前目录则不变-某/}ele{if(name[0]!='\\\\')bufferdir=trcat(bufferdir,\修改当前目录-某/bufferdir=trcat(bufferdir,name);}cur_dir=temp_dir;/某-将当前目录确定下来-某/return0;}/某----------------------------------------------------------------------------------------------某//某---------------------------------------显示当前路径-------------------------------------------某/voidhow(){printf(\}/某----------------------------------------------------------------------------------------------某//某--------------------------------------输出提示信息--------------------------------------------某/voidprint(){printf(\退出文件系统halt\\n\printf(\创建文件create文件名\\n\printf(\删除文件del文件名\\n\printf(\打开文件open文件名\\n\printf(\关闭文件cloe文件名\\n\printf(\写文件write\\n\printf(\读文件read\\n\\n\printf(\创建子目录mkdir目录名\\n\printf(\删除子目录rmdir目录名\\n\printf(\显示当前目录的子目录dir\\n\printf(\更改当前目录cd目录名\\n\}/某----------------------------------------------------------------------------------------------某//某------------------------------------------主函数----------------------------------------------某/intmain(){FILE某fp;charch;chara[100];charcode[11][10];charname[10];inti,flag,r_ize;char某contect;contect=(char某)malloc(MA某_WRITE某izeof(char));if((fp=fopen(\如果还没有进行格式化,则要格式化某/{printf(\canf(\if(ch=='y'){initfile();printf(\}ele{//return;}}enter();print();how();/某将命令全部保存在CODE数组中某/trcpy(code[0],\trcpy(code[1],\trcpy(code[2],\trcpy(code[3],\trc py(code[4],\trcpy(code[5],\trcpy(code[6],\trcpy(code[7],\trcpy(c ode[8],\trcpy(code[9],\trcpy(code[10],\while(1){canf(\for(i=0;i<11;i++){if(!trcmp(code[i],a))break;}witch(i){cae0://某--退出文件系统--//free(contect);halt();//return;cae1://某--创建文件--//canf(\flag=create(name);if(flag==-1){ printf(\}eleif(flag==-2){printf(\}eleif(flag==-3){printf(\}eleif(flag==-4){printf(\}eleif(flag==-5){printf(\}ele{printf(\}how();break;cae2://--打开文件--//canf(\fd=open(name);if(fd==-1){ printf(\}eleif(fd==-2){printf(\}eleif(fd==-3){printf(\}eleif(fd==-4){printf(\}ele{printf(\}how();break;cae3://--关闭文件--//canf(\flag=cloe(name);if(flag==-1){ printf(\}ele{printf(\}how();break;cae4:/某--写文件--某/if(fd==-1){printf(\}ele{printf(\canf(\flag=write(fd,contect,trlen(contect));if(flag==0){ printf(\}ele{printf(\}}how();break;cae5:/某--读文件--某/if(fd==-1){printf(\}ele{flag=read(fd,contect);if(flag==-1){printf(\}ele{//printf(\for(i=0;iprintf(\}printf(\}}how();break;cae6://某--删除文件--canf(\flag=del(name);if(flag==-1){ printf(\}eleif(flag==-2){printf(\}eleif(flag==-3){printf(\}ele{printf(\}how();break;cae7://某--创建子目录--/canf(\flag=mkdir(name);if(flag==-1){ printf(\}eleif(flag==-2){printf(\}eleif(flag==-3){printf(\}eleif(flag==-4){printf(\}eleif(flag==-5){printf(\}eleif(flag==-6){printf(\}eleif(flag==0){printf(\}how();break;cae8://某--删除子目录--/canf(\flag=rmdir(name);if(flag==-1){ printf(\}eleif(flag==-2){printf(\}eleif(flag==-3){printf(\}eleif(flag==0){printf(\}how();break;cae9://某--显示当前子目录--/dir();how();break;cae10:/某--更改当前目录--某/canf(\flag=cd(name);if(flag==-1) {printf(\}eleif(flag==-2){printf(\}eleif(flag==-3){printf(\}how();break;default:printf(\how();}}}。
操作系统 实验4:文件管理实验报告
一、实验题目:文件管理实验--Linux下的文件管理二、实验目的和要求:实验目的:(1)加深对文件、目录、文件系统等概念的理解。
(2)掌握 Linux 文件系统的目录结构。
(3)掌握有关 Linux 文件系统操作的常用命令。
(4)了解有关文件安全性方面的知识。
实验要求:(1)正确使用文件管理命令,能熟练地对文件进行浏览、拷贝、移动和删除。
(2)能熟练地确定和更改工作目录,查看内容和文件属性,创建和删除目录。
(3)正确地理解文件的权限,并能进行相应更改。
(4)理解文件的类型及其表示形式。
(5)理解文件名的表示形式,在模式匹配中能正确使用通配符。
三、实验内容:(1)使用pwd,cd,ls等命令浏览文件系统。
(2)使用cat,cp,mv,head,tail,rm等命令查看你的文件。
(3)使用ln命令进行文件的硬连接和符号连接。
软中断通信(4)使用find,grep命令进行文件查找和模式匹配。
(5)使用chmod命令修改文件的权限。
四、实验步骤:(说明:对本实验涉及的教材中的相关内容进行归纳总结,只需简要说明即可。
)1、用root账号登录到终端,使用pwd命令查看当前目录2、用cd命令将当前目录切换到“/”目录下3、使用ls明令查看Linux的目录结构,了解各目录存放与系统相关的文件14、使用 cat、more、head、tail等命令显示 /etc/inittab文件内容5、使用grep 命令在/etc/inittab 文件中查询“initdefault”字符串26、使用find 命令查找 /目录下所有以main 开头的文件7、使用 cp 命令将/etc目录下的inittab文件拷贝到/root目录下8、使用 sort 和uniq 命令对 /root目录下的inittab文件排序后输出其结果39、统计inittab文件的字节数、行数、字数10、用mkdir命令在/root目录下创建一个test目录11、用cp命令将/etc目录及其下所有内容复制到test目录下12、使用cd和ls查看/root/test/etc 下的内容413、将test目录改名为test214、删除test2五、实验总结:通过本次实验,让我懂得了怎样创建文件以及文件管理命令的使用,对Linux的掌握和了解进一步加深。
Linux实验4-Linux文件系统-目录和文件管理
实验报告课程名称: Linux操作系统实验名称:实验4、Linux文件系统-目录和文件管理学生姓名:班级学号学院(系):指导教师:实验时间:年月日实验成绩:实验四、Linux文件系统-目录和文件管理一、实验要求(1)掌握目录和文件管理的操作命令;(2)掌握文件权限的修改方法。
(3)掌握文件链接的方法。
二、实验内容和实验步骤【操作要求1】查看Linux系统常见的目录。
【操作步骤】输入命令:ls,查看Linux系统常见的目录,截图如下:【操作要求2】显示当前目录下文件类型。
【操作步骤】输入命令:ls –l|more,截图如下:说明:●“-”:表示普通文件●“d”:表示目录文件●“c”:表示字符设备文件●“b”:表示块设备文件●“l”:表示符号链接文件【操作要求3】查看当前目录下所有文件类型【操作步骤】输入命令:file *,截图如下:【操作要求4】先创建两个新目录dir1和dir2,然后将dir2目录移到dir1目录中,最后删除dir2目录。
【操作步骤】(1)以普通用户user登陆字符界面,输入命令:pwd,当前目录为用户的主目录:/home/user。
(2)输入命令:ls –l,查看当前目录中的所有文件。
(3)创建两个目录,输入命令:mkdir dir{1,2}。
(4)输入命令:ls –l,确认两个目录创建成功。
以上4个步骤截图如下:(5)输入命令:mv dir2 dir1,将dir2目录移动到dir1目录。
(6)输入命令:cd dir1,切换dir1目录,再输入:ls命令,查看到dir2目录。
截图如下:(7)删除dir2目录,输入命令:rm –rf dir2。
【操作要求5】查找profile文件。
【操作步骤】(1)切换用户为超级用户,输入命令:su -,并输入密码。
(2)输入命令:find /etc -name profile, 截图如下:(3) 使用exit命令,退出超级用户身份。
【操作要求6】将/etc/profile文件中所有包含“HOSTNAME”的行存入f4文件,并修改f4文件的权限,让所有用户都可以读写。
实验四 文件系统实验
实验四文件系统实验一 . 目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二 . 实验题目1、增加 2~3个文件操作命令,并加以实现。
(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。
2、编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。
3、设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。
4、根据学校各级机构,编制一文件系统。
程序运行结果如下:实验过程与结果:(可写多页)1)程序运行时,首先提示输入一个用户名(字母表示,a~z):2)输入的用户名不存在时,提示;否则,打开相应用户的文件列表:3)每个用户最多可以保存10个文件,超出时将提示出错。
当进行删除文件操作时,运行结果如下:程序源代码(C++):#include<iostream>#include<string>#include<conio.h>using namespace std;struct TYPE_UFD //用户文件目录{string File_Name; //文件名bool Read; //读保护码,true为可读bool Write; //写保护码,true为可写bool Execute; //执行保护码,true为可执行int Length_File; //文件长度};struct TYPE_MFD //主文件目录{string User_Name; //用户名TYPE_UFD *Pointer; //用户文件目录指针};struct TYPE_AFD //打开文件目录{int File_ID; //打开的文件号bool Read; //读保护码,true为可读bool Write; //写保护码,true为可写bool Execute; //执行保护码,true为可执行int Pointer; //读写指针};class TYPE_FILE_SYSTEM //文件系统类{public:void Initial( void ); //初始化void Start( void ); //开始运行文件系统private:int _Number_Users; //用户的数量int _Number_Files; //每个用户可保存的文件数int _MaxNumber_Open_Files; //每个用户在每次执行中打开的最大文件数TYPE_MFD *_MFD; //主文件目录TYPE_UFD *_UFD; //用户文件目录TYPE_AFD *_AFD; //运行文件目录};main() //主函数{TYPE_FILE_SYSTEM FS;FS.Initial();FS.Start();return 0;}void TYPE_FILE_SYSTEM::Initial( void ){_Number_Users = 10;_Number_Files = 10;_MaxNumber_Open_Files = 5;//UFD的初始化_UFD = new TYPE_UFD [_Number_Users*_Number_Files];/////////////////////////////////////MFD的初始化_MFD = new TYPE_MFD [_Number_Users];for( int i=0 ; i<_Number_Users ; i++ ){_MFD[i].Pointer = &(_UFD[i*_Number_Files]);}/////////////////////////////////////AFD的初始化_AFD = new TYPE_AFD [_MaxNumber_Open_Files];////////////////////////////////////////_MFD[0].User_Name = "YANGFAN";_UFD[0].File_Name = "YANGFAN1.txt";_UFD[0].Length_File = 10;_UFD[0].Read = true;_UFD[0].Write = false;_UFD[0].Execute = true;_UFD[1].File_Name = "YANGFAN2.txt";_UFD[1].Length_File = 20;_UFD[1].Read = true;_UFD[1].Write = false;_UFD[1].Execute = false;for( i=2 ; i<_Number_Files ; i++ ){_UFD[i].File_Name = "";_UFD[i].Length_File = -1; //表示没有文件_UFD[i].Read = false;_UFD[i].Write = false;_UFD[i].Execute = false;}///////////////////////////////////////}void TYPE_FILE_SYSTEM::Start( void ){int User_ID;int i,temp_int;string temp;char choice;int Number_Open_Files; //当前用户打开的文件数string User_Name; //当前登录的有户名string Command; //当前用户输入的命令TYPE_UFD *UFD; //当前登录的用户的文件目录do //计算机开机{do //用户登录{cout << "User name:";cin >> User_Name;//在MFD中查找该用户for( User_ID=0 ; User_ID<_Number_Users ; User_ID++ ){if( _MFD[User_ID].User_Name == User_Name )break;}if( User_ID == _Number_Users )cout << "Bad user name , please try again ." << endl;}while( User_ID == _Number_Users );cout << "Ok , welcome to login , " << User_Name << " !" << endl;UFD = _MFD[User_ID].Pointer;//初始化运行文件列表for( i=0 ; i<_MaxNumber_Open_Files ; i++ ){_AFD[i].File_ID = -1;}Number_Open_Files = 0;////////////////////////////////////////////////////////do{//接收命令cout << "C:\\" << User_Name << ">" ;cin >> Command;///////////////////////////////////////////////////////if( Command == "dir" ){//显示用户文件列表cout << endl;cout << "Files of user " << User_Name << endl;cout << "\t" << "State\t" << "Length\t" << "File name" << endl;for( i=0 ; i<_Number_Files ; i++ ){if( UFD[i].Length_File != -1 ) //该文件项不空{//打印文件状态,即保护码cout << "\t" ;if( UFD[i].Read == true )cout << "R";elsecout << "-";if( UFD[i].Write == true )cout << "W";elsecout << "-";if( UFD[i].Execute == true )cout << "E";elsecout << "-";//打印文件长度cout << "\t";cout << UFD[i].Length_File;//打印文件名cout << "\t";cout << UFD[i].File_Name << endl;}}cout << endl;////////////////////////////////////////////////////////}else if( Command == "diropen" ){//显示用户文件列表cout << endl;cout << "Opening Files of user " << User_Name << endl;cout << "\t" << "State\t" << "Open File name" << endl;for( i=0 ; i<_MaxNumber_Open_Files ; i++ ){if( _AFD[i].File_ID != -1 ) //该文件项不空{//打印文件状态,即保护码cout << "\t" ;if( _AFD[i].Read == true )cout << "R";elsecout << "-";if( _AFD[i].Write == true )cout << "W";elsecout << "-";if( _AFD[i].Execute == true )cout << "E";elsecout << "-";//打印文件名cout << "\t";cout << UFD[_AFD[i].File_ID].File_Name << endl;}}cout << endl;////////////////////////////////////////////////////////}else if( Command == "create" ){//查找是否该用户还有空的文件项,即是否还可以新建文件for( i=0 ; i<_Number_Files ; i++ )if( UFD[i].Length_File == -1 )break;if( i == _Number_Files )cout << "Error: you have already had " << _Number_Files << " files ." << endl;else{cout << "Please enter the information of the new file:" << endl;cout << "File name : ";cin >> temp;UFD[i].File_Name = temp;/////////////////////////////////////////////readcout << "Read (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )UFD[i].Read = true;elseUFD[i].Read = false;cout << endl;/////////////////////////////////////////////////////////////////////////////////////////writecout << "Write (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )UFD[i].Write = true;elseUFD[i].Write = false;cout << endl;/////////////////////////////////////////////////////////////////////////////////////////executecout << "Execute (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )UFD[i].Execute = true;elseUFD[i].Execute = false;cout << endl;/////////////////////////////////////////////////////////////////////////////////////////lengthcout << "Length :";cin >> temp_int;if( temp_int > 0 )UFD[i].Length_File = temp_int;////////////////////////////////////////////cout << "Ok , the new file " << UFD[i].File_Name << " is created!" << endl;}}else if( Command == "delete" ){cout << "Please enter the file name :";cin >> temp;//查找要删除的文件名for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files ) //没找到这个文件名的文件cout << "Bad file name , please try again ." << endl;else //成功找到文件{UFD[i].Length_File = -1; //删除文件cout << "Ok , the file " << UFD[i].File_Name << " is deleted ." << endl;}}else if( Command == "open" ){if( Number_Open_Files == _MaxNumber_Open_Files )cout << "Error: you have already opened " << Number_Open_Files << " files." << endl;else{cout << "Please enter the file name :";cin >> temp;//查找要打开的文件名for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files ) //没找到这个文件名的文件cout << "Bad file name , please try again ." << endl;else{Number_Open_Files++;for( temp_int=0 ; temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == -1 )break;_AFD[temp_int].File_ID = i;_AFD[temp_int].Pointer = 0;cout << "Please configure the open mode :" << endl;/////////////////////////////////////////////readif( UFD[i].Read == true ){cout << "Read (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )_AFD[temp_int].Read = true;else_AFD[temp_int].Read = false;cout << endl;}else_AFD[temp_int].Read = false;/////////////////////////////////////////////////////////////////////////////////////////writeif( UFD[i].Write == true ){cout << "Write (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )_AFD[temp_int].Write = true;else_AFD[temp_int].Write = false;cout << endl;}else_AFD[temp_int].Write = false;/////////////////////////////////////////////////////////////////////////////////////////executeif( UFD[i].Execute == true ){cout << "Execute (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )_AFD[temp_int].Execute = true;else_AFD[temp_int].Execute = false;cout << endl;}else_AFD[temp_int].Execute;cout << "Ok , the file " << temp << " is open ." << endl;}}}else if( Command == "logout" ){cout << "Ok , see you later , " << User_Name << " !" << endl;break;}else if( Command == "close" ){cout << "Please enter the file name :";cin >> temp;//查找要打开的文件名for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files ) //没找到这个文件名的文件cout << "Bad file name , please try again ." << endl;else{//找到了这个文件for( temp_int=0 ; temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == i )break;if( temp_int == _MaxNumber_Open_Files ) //该文件没有处于执行状态cout << "The file " << temp << " isn't open ." << endl;else //该文件处于执行状态{_AFD[temp_int].File_ID = -1;Number_Open_Files--;cout << "Ok , the file " << temp << " is closed ." << endl;}}}else if( Command == "read" ){cout << "Please enter the file name :";cin >> temp;//查找要打开的文件名for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files ) //没找到这个文件名的文件cout << "Bad file name , please try again ." << endl;else{//找到了这个文件for( temp_int=0 ; temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == i )break;if( temp_int == _MaxNumber_Open_Files ) //该文件没有处于执行状态cout << "The file " << temp << " isn't open ." << endl;else //该文件处于执行状态{if( _AFD[temp_int].Read == true )cout << "Ok , read the file " << temp << " successfully." << endl;elsecout << "Error: the open mode of the file doesn't allow you to read it ." << endl;}}}else if( Command == "write" ){cout << "Please enter the file name :";cin >> temp;//查找要打开的文件名for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files ) //没找到这个文件名的文件cout << "Bad file name , please try again ." << endl;else{//找到了这个文件for( temp_int=0 ; temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == i )break;if( temp_int == _MaxNumber_Open_Files ) //该文件没有处于执行状态cout << "The file " << temp << " isn't open ." << endl;else //该文件处于执行状态{if( _AFD[temp_int].Write == true )cout << "Ok , write the file " << temp << " successfully." << endl;elsecout << "Error: the open mode of the file doesn't allow you to write it ." << endl;}}}else if( Command == "shutdown" ){cout << "Loging out........" << endl;cout << "Ok , see you later , " << User_Name << " !" << endl;cout << "The power of the computer is shutting down.........." << endl;break;}else{cout << "Bad commands , please try again ." << endl;}}while( Command != "logout" && Command != "shutdown" ); //用户循环}while( Command != "shutdown" ); //计算机循环三 . 实验总结。
实验四 文件管理实验
实验四文件管理实验1.实验目的(1)了解文件权限。
(2)学会设置文件权限。
(3)学会管理文件权限。
2. 实验环境Linux操作系统的计算机3. 实验内容步骤1 检查系统核心首先检查你的Linux系统的核心是否有支持ACL的功能。
因为Linux系统并不是每一个版本的核心都有支持ACL的功能,而最简单的方法就是检查系统目前的核心能否支持:[root@mail /]$ cat /boot/config-kernel-version | grep -i ext3CONFIG_EXT3_FS=mCONFIG_EXT3_IDEX=yCONFIG_EXT3_FS_XA TTR_SHARING=yCONFIG_EXT3_FS_XA TTR_USER=yCONFIG_EXT3_FS_XA TTR_TRUSTED=yCONFIG_EXT3_FS_ACL=y上面命令中的kernel-version可在/boot子目录中查到,此时如果能看到上面的几项则表示已经编译到核心中,ext3文件系统已支持ACL功能,这些功能在编译核心选项中都可以找到。
步骤2 设置ACL权限先用su 命令转换到root用户;再在root用户下建立一个子目录[root@mail root]#mkdir /home/fs1将fs1子目录的权限向所有用户开放[root@mail root]#chmod -R 777 /home/fs1让所有的用户都能增加文件到目录的权限ACL常常针对个别用户来进行设置,下面是例子:例如需要创建一个wang1用户,可以先用root身份登录系统,然后执行以下命令创建用户名和密码下述命令中adduser也可是useradd不是内部命令,相应的命令文件在/usr/sbin子目录下,执行时应在命令前加上路径名/usr/sbin:[root@mail root]#adduser wang1[root@mail root]#passwd wang1将wang1 建立的文件设置读写的权限给student:先用wang1登录系统,执行命令:[wang1@mail ]$ cd /home/fs1[wang1@mail fs1]# echo "Create by wang1" > wang1.txt而如下操作则可以让除了wang1有读写的权限外其他人没有读写wang1.txt的权限(root除外),[wang1@mail fs1]# chmod go-r wang1.txt[wang1@mail fs1]# ll wang1.txt-rw------- 1 wang1 wang1 17 Jul 14 22:11 wang1.txt先用student 登录系统后执行以下命令:[student@mail fs1]# cat wang1.txtcat : wang1.txt Permission denied接着用wang1登录系统,执行如下命令:[wang1@mail fs1]# setfacl -m u:student:rw wang1.txt这样就修改权限允许student 有这个文件的读写权限。
实训项目4 文件系统管理
实训项目4 文件系统管理
一、实训目的
掌握Linux下的文件系统的创建、挂载也卸载。
掌握文件系统的自动挂载。
二、实训内容
练习Linux系统下的文件系统的创建、挂载与卸载及自动挂载的实现。
三、实训步骤
子项目1、创建/dev/sdb1和/dev/sdb5
使用fdisk命令创建/dev/sb1主分区
使用fdisk命令创建/dev/sdb2扩展分区
使用fdisk命令创建/dev/sdb5逻辑分区
输入子命令w,把设置写入硬盘分区表,推出fdisk并重启系统init 6
用mkfs命令在上述刚刚创建的分区上创建ext3文件系统和vaft文件系统
用fsck命令检查上面创建的文件系统
子项目2、挂载/dev/sdb1和/dev/sdb5
利用mkdir命令,在/mnt目录下建立挂载点,mountpoint1和mountpoint2
把上述新创建的ext3分区和vfat分区分别挂载到/mnt/mountpoint1和/mnt/mountpoint2上
利用mount命令列出挂载到系统上的分区,查看挂载是否成功
利用unmount命令卸载上面的两个分区
子项目3、实现/dev/sdb1和/dev/sdb5的自动挂载
编辑系统文件/etc/fstab文件,把上面的两个分区加入此文件中
重启系统,显示已经挂载到系统上的分区,检查是否成功
四、实训感想
对于mount - o remount /dev/sdb1 命令总不成功,仍需要重启系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四文件系统管理(二)
实验目的:
一、掌握NTFS文件压缩的特点与方法。
二、掌握EFS加密文件系统的特点与方法。
三、掌握Windows 2003的磁盘配额的原理与操作方法。
四、掌握Windows 2003中共享文件夹的设置与管理方法。
五、掌握Windows 2003中隐含共享的特点以及删除、建立的方法。
六、了解脱机文件夹的原理,熟悉脱机文件夹的操作过程。
七、了解分布式文件系统的特点与功能,掌握设置、管理DFS的方法。
实验设备:
PC机及Windows 2003系统(文件系统要求为NTFS格式)
实验内容:
一、NTFS文件系统的压缩
1. 打开某NTFS格式的分区的属性对话框,记录下当前该分区的“已用空间”和“可用空间”的具体值。
2.选中该对话框下边的“压缩驱动器以节约磁盘空间(C)”的复选框中的“√”,然后单击“应用”按钮,在出现的对话框中,选择“将更改应用于X:/、子文件夹和文件”选项,然后单击“确定”。
系统自动执行磁盘压缩功能,压缩完成后,重新打开该分区的属性对话框,记录压缩后的“已用空间”和“可用空间”的具体值,比较与压缩前的变化,并计算出的压缩比。
3.打开已经压缩的驱动器的属性对话框,将对话框下边的“压缩驱动器以节约磁盘空间(C)”的复选框中的“√”清除,即取消磁盘的压缩属性。
执行完取消压缩后,选择该磁盘内某一文件夹,并打开该文件夹的属性对话框,记录下该文件夹的大小以及占用空间的具体值,然后单击对话框右下方的“高级”按钮,选中“压缩驱动器以节约磁盘空间(C)”的复选框中的“√”,单击“确定”,执行文件压缩,压缩完成后,重新打开该文件夹的属性对话框,记录压缩后该文件夹的大小以及占用空间的具体值,比较与压缩前的变化,并计算出压缩比。
4.选择该磁盘内某一文件,并打开该文件的属性对话框,记录下该文件的大小以及占用空间的具体值,然后单击对话框右下方的“高级”按钮,选中“压缩驱动
器以节约磁盘空间(C)”的复选框中的“√”,单击“确定”,执行文件压缩,压缩完成后,重新打开该文件的属性对话框,记录压缩后该文件的大小以及占用空间的具体值,比较与压缩前的变化,并计算出压缩比。
5.在某个NTFS格式的分区内选择一个文件夹(或文件)进行压缩,压缩后将该文件夹(或文件)复制或移动到一个FAT 32格式的分区内,打开该文件夹(或文件)的属性对话框,记录该文件夹(或文件)当前的大小以及占用空间的具体值。
思考1:
在Windows 2003中,对文件夹或者文件进行压缩与使用Winzip或者Winrar等压缩工具进行压缩是否相同?Winzip等工具是否能够执行整个磁盘的压缩?
思考2:
在FAT32格式的分区内是否能够执行文件压缩?
二、加密文件系统(EFS)
1.在NTFS格式的分区中,选择其中某一个文件夹,打开其属性对话框,单击“高级”按钮,在“高级属性”对话框中,选中“加密内容以便保护数据(E)”复选框中的“√”,然后单击“确定”按钮,选择“将更改应用于X:/、子文件夹和文件”,然后单击“确定”。
2.操作完成后,打开该文件夹及其中的文件进行访问,观察加密前后访问权限是否发生变化。
3.在“计算机管理”中新建一用户user5,然后以user5的用户身份登陆,登陆后,访问在第1步中加密了的文件夹及其中的子文件夹,比较使用user5登陆访问该文件夹及子文件夹是否有权限的变化,继续访问该文件夹或子文件夹中的文件,比较访问权限是否发生了变化,是否能够打开或执行其中的文件。
4.注销user5用户,重新以administrator用户身份登陆,将第1步中加密的文件夹复制或移动到另一FAT32格式的分区中,打开复制或移动后的文件夹的属性对话框,观察是否还具有加密的属性。
5.在NTFS格式的分区中,对某一文件夹进行压缩,压缩后再进行文件加密,观察是否能够进行。
6. 在NTFS格式的分区中,对某一文件夹进行文件加密,加密后再进行压缩,观察是否能够进行。
思考:
通过5、6两题,总结在Windows 2003中,压缩和加密的关系。
7.将已加密的文件夹中的某一文件复制或移动到同一分区中另外一个未作加密的文件夹中,观察复制或移动后该文件是否还具备加密属性。
三、磁盘配额练习
1.选择系统中某一NTFS格式的分区,打开其属性对话框,选择“配额”标签,观察系统默认的磁盘配额情况。
2.选中“启用配额管理(E)”复选框的“√”。
3.选中“将磁盘空间限制为”单选按钮,并将磁盘空间限制设为:20KB,将警告等级设置为:15KB。
4.尝试在该分区内复制或者新建一文件,要求该文件大小为20KB以上。
观察系统是否有警告或者提示说明磁盘空间不足。
5.在“计算机管理”中新建一用户user6,并重新以user6的用户身份登陆,执行第4步要求,观察是否有警告或提示说明磁盘空间不足。
6.重新以Administrator用户身份登陆,在该磁盘属性的配额标签中,选中“拒绝将磁盘空间给超过配额限制的用户”复选框中的“√”,然后再以user6用户身份登陆,并执行第4步要求,观察是否有警告或提示说明磁盘空间不足。
思考:
(1)通过以上的操作,体会严格配额与宽松配额在Windows 2003中的具体区别是什么?
(2)按照上述方法设置严格配额有哪些局限性?
7.在该磁盘的属性对话框中的配额标签中,单击右下角的“配额项”按钮,在打开的“本地磁盘的配额项目”对话框中,实现以下要求:
(1)对user1和user2用户设置磁盘空间限制为1M,警告级别为800K;
(2)对user3和user4用户设置磁盘空间限制为10M,警告级别为8M;
(3)对user5和user6用户设置磁盘空间限制为100M,警告级别为80M。
8.分别以user1、user3和user5用户登陆后,通过复制、新建等方法在使用该磁盘内空间,并观察系统的警告等情况。
9.以Administrator用户身份登陆后,将user3和user5两个用户的磁盘配额项目删除。
四、共享文件夹的管理
1.对某NTFS分区内的一个文件夹进行共享的设置,要求最多允许2个用户进行访问,其他为系统默认。
2. 对某NTFS分区内的一个文件夹进行共享的设置,要求不设置访问用户的数量限制,设置共享权限为Everyone组只有读取的权限。
3. 对某NTFS分区内的一个文件夹进行共享的设置,要求只有class01组当中的用户具有更改的权限,其他组或者用户都不能访问该共享文件夹。
4.在计算机管理中设置和停止共享文件夹。
5.打开“网上邻居”,在地址栏中输入“\\邻近计算机名/E$”,观察是否能够打开邻近的计算机的相应分区。
思考:
考虑隐含共享的特点、功能以及其所存在的安全隐患等问题。
6.在本机的“计算机管理”中的“共享文件夹”项目中,观察系统默认的隐含共享的对象有哪些。
7.删除系统默认的E分区的隐含共享,重新执行第5步操作,观察变化。
8.在“共享文件夹”中,将E分区中的某一个文件夹设置为隐含共享,并尝试从其他的计算机对该隐含共享文件夹进行访问。
五、分布式文件系统
1.在“管理工具”的“分布式文件系统”中以本机为服务器新建一个独立的Dfs根目录。
2.以新建的Dfs根目录为基础,在该根目录上建立至少4个Dfs的链接,要求四个链接分别位于网上邻居的4台计算机上。
3.在建立完成的分布式文件系统上对各个链接进行文件复制,粘贴等操作。
思考:
分布式文件系统在实际管理中的应用有哪些?。