实验5Linux文件管理课案.docx

上传人:b****9 文档编号:26393976 上传时间:2023-06-18 格式:DOCX 页数:35 大小:794.03KB
下载 相关 举报
实验5Linux文件管理课案.docx_第1页
第1页 / 共35页
实验5Linux文件管理课案.docx_第2页
第2页 / 共35页
实验5Linux文件管理课案.docx_第3页
第3页 / 共35页
实验5Linux文件管理课案.docx_第4页
第4页 / 共35页
实验5Linux文件管理课案.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

实验5Linux文件管理课案.docx

《实验5Linux文件管理课案.docx》由会员分享,可在线阅读,更多相关《实验5Linux文件管理课案.docx(35页珍藏版)》请在冰豆网上搜索。

实验5Linux文件管理课案.docx

实验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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1