基础知识之操作系统实验(五)-简单文件管理系统

7 篇文章 0 订阅
6 篇文章 3 订阅

一、实验目的

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:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值