实验5Linux文件管理课案.docx
《实验5Linux文件管理课案.docx》由会员分享,可在线阅读,更多相关《实验5Linux文件管理课案.docx(35页珍藏版)》请在冰豆网上搜索。
实验5Linux文件管理课案
实验5Linux文件管理
学校:
FJUT学号:
3131903229班级:
计算机1302姓名:
姜峰
注:
本次实验为了简化操作,均采用指定文件名和目录名,其中路径也为指定路径。
一.实验学时与类型
学时:
2,课外学时:
自定
实验类型:
验证、设计性实验
二.实验目的
(1)了解操作系统文件系统的工作原理和工作方式;
(2)了解文件和目录操作的系统调用用户接口;
(3)了解Linux提供的文件系统调用的使用方法。
三.实验内容
(1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:
功能
命令行
0.退出
exit
1.创建新文件
createfilefilename
2.写文件
writefilename
3.读文件
readfilename
4.复制文件
Copysrcname,dstname
5.修改文件权限
chmodfilenamemode
6.查看文件权限
lsmodfilename
7.创建目录
createdirpathname
8.查看目录
lspathname
9.删除目录
rmdirpathpame
10.切换当前目录
cdpathname
11建立符号链接
lnfilesysfile
具体编程实现时,可以以菜单方式(左栏)提供功能选择,也可以按命令行方式(右栏)动态输入有关命令。
头文件:
#include
#include
#include
#include
#include
#include
#include
#include
主界面源码:
intmain()
{
intn;
while
(1)
{
printf("0.退出\n1.创建新文件\n2.写文件\n3.读文件\n4.复制文件\n");
printf("5.修改文件权限\n6.查看文件权限\n7.创建子目录8.查看目录\n");
printf("9.删除子目录\n10.改变当前目录到指定目录\n11.建立符号链接\n");
printf("PleaseInputYourChoice:
");
scanf("%d",&n);
switch(n)
{
case0:
Quit();break;
case1:
CreateFile();break;
case2:
WriteInFile();break;
case3:
ReadInFile();break;
case4:
CopyFile();break;
case5:
AlterFileAuthority();break;
case6:
ViewFileAuthority();break;
case7:
CreateSubdirectory();break;
case8:
ViewFilePathname();break;
case9:
DeleteSubdirectory();break;
case10:
CdToDestination();break;
case11:
LinkOperating();break;
default:
printf("Youhaveawrongchoice!
\n");
}
printf("\n");
}
return0;
}
实验过程截图:
1.退出
源码:
voidQuit()//0.退出
{
exit(0);
}
2.创建新文件
原来文件夹中的文件:
创建了一个为空的jiangfeng.c:
源码:
voidCreateFile()//1.创建新文件
{
intfp;
if((fp=open("/home/test5/jiangfeng.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0)
{
perror("open");
}
else
{
printf("Createfile:
jiangfeng.c\n");
}
getchar();
if(close(fp)<0)
{
perror("close");
}
else
{
printf("Closefile:
jiangfeng.c\n");
}
}
3.写文件
向jiangfeng.c中写入数据:
打开jiangfeng.c查看:
源码:
voidWriteInFile()//2.写文件
{
intfp;
charbuf[1024];
if((fp=open("/home/test5/jiangfeng.c",O_CREAT|O_APPEND|O_RDWR,0666))<0)
{
perror("open");
}
else
{
printf("Openfile:
jiangfeng.c\n");
}
printf("Pleaseinputyourdata(<1024bytes):
\n");
scanf("%s",buf);
if(write(fp,buf,strlen(buf))<0)
{
perror("write");
}
else
{
printf("WrittenSuccess!
\n");
}
getchar();
if(close(fp)<0)
{
perror("close");
}
else
{
printf("Closefile:
jiangfeng.c\n");
}
}
4.读文件
从jiangfeng.c中读数据:
再次写入一段数据:
再次从文件中读数据发现刚才的数据附在末尾,表面写数据是从文件末尾开始写的:
源码:
voidReadInFile()//3.读文件
{
intfp;
char*buf;
intfront,rear;
if((fp=open("/home/test5/jiangfeng.c",O_RDWR,0666))<0)
{
perror("open");
}
else
{
printf("Openfile:
jiangfeng.c\n");
}
getchar();
rear=lseek(fp,0,SEEK_END);
front=lseek(fp,0,SEEK_SET);//设置文件指针位置
front=rear-front;
buf=(char*)malloc(front);
if(read(fp,buf,front+1)<0)
{
perror("read");
}
else
{
printf("ReadSuccess!
\n");
}
printf("%s\n",buf);
getchar();
if(close(fp)<0)
{
perror("close");
}
else
{
printf("Closefile:
jiangfeng.c\n");
}
}
5.复制文件
在本目录下又创建一个jiangfengcopy.c的文件并将jiangfeng.c的数据copy到其中
观察jiangfengcopy.c的数据与jiangfeng.c数据对比:
源码:
voidCopyFile()//4.复制文件
{
intfp,fd;
char*buf;
intfront,rear;
if((fp=open("/home/test5/jiangfeng.c",O_RDWR,0666))<0)
{
perror("open");
}
else
{
printf("Openfile:
jiangfeng.c\n");
}
getchar();
rear=lseek(fp,0,SEEK_END);
front=lseek(fp,0,SEEK_SET);//设置文件指针位置
front=rear-front;
buf=(char*)malloc(front);
if(read(fp,buf,front+1)<0)
{
perror("read");
printf("CopyError!
\n");
}
else
{
if((fd=open("/home/test5/jiangfengcopy.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0)
{
perror("open");
printf("CopyError!
\n");
}
if(write(fd,buf,strlen(buf))<0)
{
perror("write");
printf("CopyError!
\n");
}
else
{
printf("Copyfromjiangfeng.ctojiangfengcopy.cSuccess!
\n");
}
}
getchar();
if(close(fp)<0||close(fd)<0)
{
perror("close");
}
else
{
printf("Closefile:
jiangfeng.candjiangfengcopy.c\n");
}
}
6.修改文件权限以及查看文件权限
先查看原本文件权限:
再修改文件权限:
已改为“读”权限:
源码:
voidAlterFileAuthority()//5.修改文件权限
{
intn;
printf("0.读,写,执行1.读2.写3.执行\n");
printf("PleaseInputYourChoice:
");
scanf("%d",&n);
switch(n)
{
case0:
chmod("/home/test5/jiangfeng.c",S_IRWXU);break;//读,写,执行
case1:
chmod("/home/test5/jiangfeng.c",S_IRUSR);break;//读
case2:
chmod("/home/test5/jiangfeng.c",S_IWUSR);break;//写
case3:
chmod("/home/test5/jiangfeng.c",S_IXUSR);break;//执行
default:
printf("Youhaveawrongchoice!
\n");
}
}
voidViewFileAuthority()//6.查看文件权限
{
char*path="/bin/ls";
char*argv[4]={"ls","-l","/home/test5/jiangfeng.c",NULL};
execv(path,argv);//执行ls–ljiangfeng.c
}
7.创建子目录
可看到目录中出现jiangfeng的子目录:
源码:
voidCreateSubdirectory()//7.创建子目录
{
if(mkdir("/home/test5/jiangfeng",S_IRWXU)<0)
{
perror("mkdir");
}
else
{
printf("CreateSuccess!
\n");
}
}
8.
查看目录
查看当前目录下的文件:
源码:
voidViewFilePathname()//8.查看目录
{
char*path="/bin/ls";
char*argv[4]={"ls","-l",NULL};
execv(path,argv);//执行ls–l
}
9.删除子目录
观察后,发现已将jiangfeng子目录删除:
源码:
voidDeleteSubdirectory()//9.删除子目录
{
if(rmdir("/home/test5/jiangfeng")<0)
{
perror("rmdir");
}
else
{
printf("DeleteSuccess!
\n");
}
}
10.改变当前目录到指定目录(到test3中)
查看当前目录下文件,说明已经转到test3下。
源码:
voidCdToDestination()//10.改变当前目录到指定目录
{
if(chdir("/home/test3")<0)
{
perror("chdir");
}
else
{
printf("UpdateSuccess!
\n");
}
}
11.
建立符号链接
建立一个名为jiang.c的链接
查看目录,发现链接已建立:
源码:
voidLinkOperating()//11.建立符号链接
{
if(link("jiangfeng.c","jiang.c")<0)
{
perror("link");
}
else
{
printf("CreateSuccess\n");
}
}
(2)利用winhex工具解析FAT文件系统格式,并给出文件系统类型有关分析数据。
提示:
由于磁盘容量通常较大,可选择一个小容量U盘进行分析。
(选做)
我采用u盘详情如下:
此图为winhex分析后的主界面:
启动扇区放在物理空间的第一个地址:
FAT1区:
FAT2区:
容量备用区:
剩余空间区:
这些为u盘内数据(删除后的文件均为半透明显示):
对于FAT32系统格式详情请参考
四.相关实验指导
1.文件系统调用
(1)打开或新建文件系统调用open函数
intopen(constchar*pathname,intflags);
intopen(constchar*pathname,intflags,mode_tmode);
intcreat(constchar*pathname,mode_tmode);【与intopen(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);作用相同】
参数说明:
◆pathname:
要打开或新建的文件名称。
◆flags:
标志位,指定打开文件的操作方式及打开时的一些行为。
O_RDONLY--只读O_WRONLY—只写O_RDWR—可读可写
还可以用或运算对下列标志进行组合
O_CREAT---如果文件不存在则创建,存在则不再创建
O_TRUNC---如果文件已存在,则清除文件原有内容
O_EXECL---如果文件已存在,又设置了O_CREAT,则强制open失败
O_APPEND---每次写入时从文件尾部开始。
例:
创建一个可读可写的文件file1,可用fd=open(“file1”,O_CREAT|O_RDWR);
◆mode:
用于指定新文件的权限标志位。
如果打开时使用了O_CREAT标志创建新文件,则一般都要给出mode参数,它的一些常用取值如下所示,这些值可以用按位或的方式组合使用。
新文件的所属用户和所属组则是创建它的进程的所属用户和所属组。
权限标志定义 对应的八进制值 含义
S_IRWXU 00700 文件所属用户有读写和执行权限
S_IRUSR(S_IREAD) 00400 文件所属用户有读权限
S_IWUSR(S_IWRITE) 00200 文件所属用户有写权限
S_IXUSR(S_IEXEC) 00100 文件所属用户有执行权限
S_IRWXG 00070 组内用户有读写和执行权限
S_IRGRP 00040 组内用户有读权限
S_IWGRP 00020 组内用户有写权限
S_IXGRP 00010 组内用户有执行权限
S_IRWXO 00007 其他用户有读写和执行权限
S_IROTH 00004 其他用户有读权限
S_IWOTH 00002 其他用户有写权限
S_IXOTH 00001 其他用户有执行权限
◆返回值:
操作成功则返回文件描述符,否则返回-1并设置标量errno的值。
(2)ssize_tread(intfd,void*buf,size_tcount);//读文件中数据
(3)ssize_twrite(intfd,constvoid*buf,size_tcount);//将数据写入文件
(4)intlseek(intfd,offset_toffseet,intwhence);//文件读写指针定位
origin:
SEEK_CUR当前位置、SEEK_SET文件开始、SEEK_END文件尾
(5)intclose(intfd);//关闭文件
(6)intchmod(char*pathname,mode_tmode);//更改文件权限
mode参数与open函数中的mode参数相同
(7)intmkdir(constchar*path,mode_tmode);//mode是子目录的权限
(8)intrmdir(constchar*path);//删除子目录
(9)intchdir(constchar*path);//切换当前目录
(10)DIR*opendir(constchar*path);//打开目录,失败时返回空指针
(11)intclosedir(DIR*dirp);//关闭已打开的目录
(12)structdirent*readdir(DIR*dir_handle);//读取dir_handle目录下目录项,返回dirent结构体指针,若已无未读目录项返回NULL。
dirent结构体成员如下:
structdirent
{
longd_ino;//inodenumber索引节点号
off_td_off;//offsettothisdirent在目录文件中的偏移
unsignedshortd_reclen;//lengthofthisd_name文件名长
unsignedchard_type;//thetypeofd_name文件类型
chard_name[NAME_MAX+1];//文件全名,最长255字符
}
(13)intlink(constchar*oldpath,constchar*newpath);
//以newpath为名建立一个硬链接到oldpath,成功返回0,失败为-1。
如:
link(“etc/passwd”,”pass”);
(14)intsymlink(constchar*oldpath,constchar*newpath);//建立符号链接
(15)intunlink(constchar*pathname);//取消指定的链接
2.文件操作类C语言库函数
(1)FILE*fopen(constchar*filename,constchar*mode);//打开或创建文件
参数说明:
filename同上面pathname,mode说明如下:
r或rb打开只读文件,b表示二进制文件。
r+或rb+打开可读写的文件,该文件必须存在。
w或wb打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。
若文件不存在则建立该文件。
w+或wb+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。
若文件不存在则建立该文件。
a或ab以附加的方式打开只写文件。
若文件不存在,则会建立该文件。
a+或ab+以附加方式打开可读写的文件。
若文件不存在,则会建立文件。
由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限。
(2)size_tfwrite(constvoid*buffer,size_tsize,size_tcount,FILE*stream);//写文件
(3)size_tfread(void*buffer,size_tsize,size_tcount,FILE*stream);//读文件
(4)intfseek(FILE*stream,longoffset,intorigin);//文件读写指针定位
origin:
SEEK_CUR当前位置、SEEK_SET文件开始、SEEK_END文件尾
(5)intfclose(FILE * stream);//关闭文件
备注:
在实现程序功能时,推荐调用上述函数,当然也可以调用linux相关命令。
3.有关头文件
#include
#include
#include
#include
#include
#include
#include