一、实验目的
1. 深入了解文件管理系统,初步掌握文件管理系统的实现方法。
2. 掌握文件系统的工作机理
二、实验内容
利用Linux文件系统调用函数编程实现对文件和目录的基本操作
三、实验指导
1、创建文件 creat()
需要的头文件有#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
语法格式如下 int creat( const char * pathname, mode-t mode)
Pathname为指向新创建的文件的字符串指针,mode用来规定相关权限,返回值为整形的文件描述符
例如,在当前目录下创建名为file的文件权限为可读
Int fd=creat(“./file”,0400);
2、打开文件 open()
语法格式 int open(const char* pathname,int flags,[mode_t mode]);
Flags的可能取值为:
O_RDONLY: 只读方式
O_WRONLY: 只写方式
O_RDWR: 读写方式
需要注意的是 mode规定被打开文件的存取权限,仅当新穿件文件时才需要该参数,所以是可选的,而flags对定了打开文件的方式,即要对文件进行的操作
3、关闭文件 close()
需要的头文件 #include <unistd.h>
语法格式 int close(int fd);
4、读文件 read()
需要的头文件 #include <unistd.h>
语法格式 size_t read(int fd, void * buf, size_t count);
在文件fd中读取count字节的数据放入buf中,返回值为成功读取的字节数。
5 、写文件 write()
需要的头文件 #include <unistd.h>
语法格式 size_t write(int fd, const void * buf, size_t count);
将缓冲区中的count字节的数据写入文件fd中
6、移动文件的读写位置 lseek()
当打开文件时都有一个读写位置,通常指向文件的头部,如果是追加方式,则指向文件尾部。利用lseek()可以修改读写位置
需要的头文件 #include <sys/types.h> #include <unistd.h>
语法格式 off_t lseek( int fd, off_t offset, int whence);
Fd为文件描述符, offset为偏移量,每次移动的量,可正可负,相对于参考位置whence来说。Whence的取之为: SEEK_SET或0: 从文件头移动offset个位移量,作为新的读写位置; SEEK_CUR或1:从当前位置移动offset个位移量,作为新的读写位置;SEEK_END或2:从文件尾部移动offset个位移量,作为新的读写位置;
7、删除文件 unlink()
需要的头文件 #include <unistd.h>
语法格式 int unlink(const char * pathname);
8、改变文件的权限 chmod()
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
语法格式 int chmod(const char * path, mode_t mode)
9、创建目录 mkdir()
#include<sys/types.h>
#include<sys/stat.h>
Int mkdir( const char * pathname, mode_t mode);
10、修改目录 chdir()
11、删除目录rmdir()
12、打开目录 opendir()
头文件 #include <sys/types.h>
#include <dirent.h>
13、关闭目录 closedir()
14、读取目录 readdir()
四、实验代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <syslog.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include<sys/stat.h>
#include<fcntl.h>
#define MAX 128
int chmd();//change the mode
int chmd(char file[])
{
int c;
mode_t mode=S_IWUSR;
printf("请选择你想要的权限!\n");
printf("*********************************************\n");
printf("0. 0700\n1. 0400\n2. 0200\n3. 0100\n");
printf("*********************************************\n");
scanf("%d",&c);
switch(c)
{
case 0: chmod(file,S_IRWXU);break;
case 1: chmod(file,S_IRUSR);break;
case 2: chmod(file,S_IWUSR);break;
case 3: chmod(file,S_IXUSR);break;
default: printf("You have a wrong choice!\n");
}
return 0;
}
int main()
{
DIR * dir;
struct dirent * ptr;
int fd;
int num;
int choice;
int del;
char buffer[MAX],file[20],s;
struct stat buf;
mkdir("./newdir",0700);
chdir("./newdir");
while(1)
{
printf("\n**************************************\n");
printf("0. 退出系统\n");
printf("1. 创建文件\n");
printf("2. 写文件\n");
printf("3. 读文件\n");
printf("4. 改变文件权限\n");
printf("5. 显示文件权限\n");
printf("6. 删除文件\n");
printf("7. 显示文件\n");
printf("**************************************\n");
printf("请选择相关操作:");
scanf("%d",&choice);
switch(choice)
{
case 0: exit(0);
case 1:
printf("请输入要创建的文件名:\n");
scanf("%s",file);
fd=creat(file,S_IRWXU);
if(fd==-1)
{
printf("文件创建失败:\n");
}
else
{
printf("新创建的文件描述符为:fd=%d\n",fd);
fd = open(file,O_WRONLY,0750);
printf("请输入文件内容,长度小于128个字符:\n");
num = read(0,buffer,MAX);
write(fd,buffer,num);
printf("文件输入成功!\n");
}
break;
case 2:
printf("请输入要打开的文件名:\n");
scanf("%s",file);
fd = open(file,O_WRONLY,0750);
if(fd==-1)
{
printf("文件打开失败,请检查是否存在!:\n");
}
else
{
printf("请输入文件内容,长度小于128个字符:\n");
num = read(0,buffer,MAX);
write(fd,buffer,num);
printf("文件输入成功!\n");
}
break;
case 3:
printf("请输入要打开的文件名!\n");
scanf("%s",file);
fd = open(file,O_RDONLY,0750);
if(fd==-1)
{
printf("文件不存在!\n");
break;
}
num = read(fd,buffer,MAX);
printf("文件内容为\n");
write(1,buffer,num);
break;
case 4:
printf("文件输入文件名:\n");
scanf("%s",file);
chmd(file);
printf("文件权限修改成功!\n");
system("ls -li");
break;
case 5:
printf("文件输入文件名:\n");
scanf("%s",file);
printf("文件权限如下所示!\n");
system("ls -li");
break;
case 6:
printf("输入要删除的文件名:\n");
scanf("%s",file);
fd = open(file,O_RDONLY,0750);
if(fd==-1)
{
printf("文件不存在\n");
}
int ret = unlink(file);
printf("文件删除成功\n");
if(ret < 0)
{
perror("删除失败");
}
break;
case 7:
system("ls");
break;
}
}
}
五、实验结果
图1 :
图2:
图3: