⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rdwt.c

📁 此版本是在网上广为流传的 二级文件系统 基础上制作的.重新编写了块操作等模块,修正了N多BUG. 实现的命令有 ls-列目录 md-创建目录 cd-进入子目录 mf-创建文件 cat-显示文件内
💻 C
字号:
#include <stdio.h>
#include "filesys.h"

unsigned int read(fd1,buf,size)
int fd1;
char *buf;
unsigned int size;
{
    unsigned long off;
    int block,block_off,i,j;
    struct inode *inode;
    char *temp_buf;
    
    inode=sys_ofile[user[user_id].u_ofile[fd1]].f_inode;
    printf("\nf_inode=%d\n",sys_ofile[user[user_id].u_ofile[fd1]].f_inode);
    if(! (sys_ofile[user[user_id].u_ofile[fd1]].f_flag&FREAD))
    {
       printf("\nthe file is not opened for read\n");
       return 0;
    }
       temp_buf=buf;
       off=sys_ofile[user[user_id].u_ofile[fd1]].f_off;
       if((off+size)>inode->di_size) size=inode->di_size-off;
       block_off=off%BLOCKSIZ;
       block=off/BLOCKSIZ;
       if(block_off+size<BLOCKSIZ)
       {
              fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET);
              fread(buf,1,size,fd);
              return size;
       }
       fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET);
       fread(temp_buf,1,BLOCKSIZ-block_off,fd);
       temp_buf+=BLOCKSIZ-block_off;
       
       j=(inode->di_size-off-block_off)/BLOCKSIZ;
       
       for(i=0;i<(size-block_off)/BLOCKSIZ;i++)
       {
              fseek(fd,DATASTART+inode->di_addr[j+i]*BLOCKSIZ,SEEK_SET);
              fread(temp_buf,1,BLOCKSIZ,fd);
              temp_buf+=BLOCKSIZ;
       }
       block_off=(size-block_off)%BLOCKSIZ;
       block=inode->di_addr[off+size/BLOCKSIZ+1];
       fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
       fread(temp_buf,1,block_off,fd);
       sys_ofile[user[user_id].u_ofile[fd1]].f_off+=size;
       return size;
}


unsigned int write(fd1,buf,size)    /*write*/
unsigned short fd1;
char  *buf;
unsigned int size;
{
 unsigned long off;
 int block,block_off,i,j, k=0;
 struct inode *inode;
 char *temp_buf;
 
 printf("\nf_off=%d\n",sys_ofile[user[user_id].u_ofile[fd1]].f_off); 
 inode=sys_ofile[user[user_id].u_ofile[fd1]].f_inode;
 printf("\ndi_size=%d,i_ino=%d\n",inode->di_size,inode->i_ino); 
 if(! (sys_ofile[user[user_id].u_ofile[fd1]].f_flag & FWRITE))
 {
   printf("\nthe file is not opened for wrie\n");
   return 0;
 }
 temp_buf=buf;
 off=sys_ofile[user[user_id].u_ofile[fd1]].f_off;
 block_off=off%BLOCKSIZ;
 block=off/BLOCKSIZ;
 
/*  if(sys_ofile[user[user_id].u_ofile[fd1]].f_flag == FAPPEND) 
  { 
//    fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET); 
//    fwrite(temp_buf,1,BLOCKSIZ-block_off,fd); 
//    temp_buf+=BLOCKSIZ-block_off; 
//    k=1; 
  } 
  else {
      size = inode->di_size - off;
  }*/
 if(off+size<=inode->di_size)
 {
   fseek(fd,DATASTART+inode->di_addr[block]* BLOCKSIZ+block_off,SEEK_SET);
   fwrite(buf,1,BLOCKSIZ-block_off,fd);

   j = BLOCKSIZ-block_off;
   //无符号数不能为负,所以强制转换SIZE 为 LONG, 以便负数正常使用 
   for (i = 0; i < ((long)size-(BLOCKSIZ-block_off))/BLOCKSIZ+(((long)size-(BLOCKSIZ-block_off))%BLOCKSIZ!=0); ++i) {
          fseek(fd,DATASTART+inode->di_addr[block+1+i]* BLOCKSIZ,SEEK_SET);
          fwrite(buf+j,1,BLOCKSIZ,fd);
          j += BLOCKSIZ;
   }    
   return size;
 }
 
   fseek(fd,DATASTART+inode->di_addr[block]* BLOCKSIZ+block_off,SEEK_SET);
   fwrite(buf,1,BLOCKSIZ-block_off,fd);
   temp_buf += BLOCKSIZ-block_off;
   for (i = 0; i < (inode->di_size-off-(BLOCKSIZ-block_off))/BLOCKSIZ+((inode->di_size-off-(BLOCKSIZ-block_off))%BLOCKSIZ!=0); ++i) {
          fseek(fd,DATASTART+inode->di_addr[block+1+i]* BLOCKSIZ,SEEK_SET);
          fwrite(temp_buf,1,BLOCKSIZ,fd);
          temp_buf += BLOCKSIZ;
   }
   j = block+1+i;
   for (i = 0; i < (off + size - inode->di_size)/BLOCKSIZ+((off + size - inode->di_size)%BLOCKSIZ!=0); ++i) {
          inode->di_addr[j+i]=balloc();
          fseek(fd,DATASTART+inode->di_addr[j+i]* BLOCKSIZ,SEEK_SET);
          fwrite(temp_buf,1,BLOCKSIZ,fd);
          temp_buf += BLOCKSIZ;
   }
   //inode->di_size = off+size;
   
  
/*  
 printf("\nsize=%d,block_off=%d\n",size,block_off); 
 for(i=0;i<(size-k*(BLOCKSIZ-block_off))/BLOCKSIZ+((size-k*(BLOCKSIZ-block_off))!=0);i++)
 {
   inode->di_addr[block+i]=balloc();
   fseek(fd,DATASTART+inode->di_addr[block+k+i]*BLOCKSIZ,SEEK_SET);
   fwrite(temp_buf,1,BLOCKSIZ,fd);
   temp_buf+=BLOCKSIZ;
 }
   block_off=(size-k*(BLOCKSIZ-block_off))%BLOCKSIZ;
   block=inode->di_addr[block+k+i]=balloc();
   fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
   fwrite(temp_buf,1,block_off,fd);*/
   sys_ofile[user[user_id].u_ofile[fd1]].f_off+=size;
   inode->di_size=sys_ofile[user[user_id].u_ofile[fd1]].f_off; 
   return size;
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -