二級文件管理課程設計_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  操作系統(tǒng)二級文件管理課程設計</p><p>  課程設計名稱: 二級文件管理系統(tǒng) </p><p>  專 業(yè)班 級 : </p><p>  學 生姓 名 : </p><p>  學 號 </

2、p><p>  指 導 老 師 : </p><p><b>  設計目的</b></p><p>  通過一個簡單多用戶文件系統(tǒng)的設計,加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實現(xiàn)。</p><p><b>  二、設計內(nèi)容</b></p><p>  

3、為linux系統(tǒng)設計一個簡單的二級文件系統(tǒng)。要求做到以下幾點:</p><p> ?。?)可以實現(xiàn)下列幾條命令(至少4條);</p><p>  login用戶登陸</p><p>  dir 列文件目錄</p><p>  create創(chuàng)建文件</p><p>  delete刪除文件</

4、p><p>  open 打開文件</p><p>  close關閉文件</p><p>  read 讀文件</p><p>  write寫文件</p><p>  rename 重命名</p><p> ?。?)列目錄時要列出文件名、物理地址、

5、保護碼和文件長度;</p><p>  (3)源文件可以進行讀寫保護。</p><p><b>  三、程序設計</b></p><p>  1、在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲器,在其上實現(xiàn)一個多用戶多目錄的文件系統(tǒng)。</p><p>  2、文件物理結(jié)構(gòu)可采用顯式鏈接或其他方法。</p><

6、;p>  3、磁盤空閑空間的管理可選擇位示圖或其他方法。如果采用位示圖來管理文件存儲空間,并采用顯式鏈接分配方式,則可以將位示圖合并到FAT中。</p><p>  4、文件目錄結(jié)構(gòu)采用多用戶多級目錄結(jié)構(gòu),每個目錄項包含文件名、物理地址、長度等信息,還可以通過目錄項實現(xiàn)對文件的讀和寫的保護。</p><p>  5、設計一個較實用的用戶界面,方便用戶使用。要求提供以下相關文件操作:用

7、戶登錄、創(chuàng)建目錄、刪除目錄、創(chuàng)建文件、刪除文件、讀文件、寫文件、</p><p><b>  重命名、退出。</b></p><p><b>  四、源代碼</b></p><p>  1、FileSystem.h</p><p>  #define DIR_LENGTH 1024

8、 //路徑最長可達100字節(jié)</p><p>  #define MAX_WRITE 1024*128 //寫入文字可達128k字節(jié)</p><p>  #define MEM_D_SIZE 1024*1024 //1M磁盤空間</p><

9、;p>  #define DISKSIZE 1024 //磁盤塊的大小 1K</p><p>  #define MSD 5 //最大子目錄數(shù) 5</p><p>  #define DISK_NUM MEM_D_SIZE/DISKSIZE

10、 //磁盤塊數(shù)目 1024=1M/1K</p><p>  #define FATSIZE DISK_NUM*sizeof(struct FatItem) //FAT表大小1024*8=8K</p><p>  #define MOFN 5 //最大文件打開數(shù) 5 </p>

11、<p>  #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目錄起始盤塊號 9</p><p>  #define ROOT_DISK_SIZE sizeof(struct Direct) //根目錄大小 196</p><p>  #define LOGIN 15</p><p>

12、;  #define NAME_LONG 1</p><p>  #define NOT_EXSIT -1</p><p>  #define NOT_OPEN -1</p><p>  #define DIR_FULL -2</p><p>  #define OPEN_FULL -3</p><p>  

13、#define ALREADY -4 </p><p>  #define NOT_R_W -4</p><p>  #define DISK_FULL -5</p><p>  #define NOT_EXIT -1</p><p>  struct FatItem

14、 // size 8</p><p>  { int item; //存放文件下一個磁盤的指針</p><p>  char em_disk; //磁盤塊是否空閑標志位, 0 空閑</p><p><b>  };&l

15、t;/b></p><p>  struct Direct</p><p>  {struct FCB</p><p>  {char name[8]; //文件/目錄名 8位</p><p>  char property;

16、 //屬性 1位目錄 0位普通文件</p><p>  int size; //文件/目錄字節(jié)數(shù)、盤塊數(shù))</p><p>  int firstDisk; //文件/目錄 起始盤塊號</p><p>  int next;

17、 //子目錄起始盤塊號</p><p>  int sign; //1是根目錄 0不是根目錄</p><p>  }directItem[MSD+2]; //最大子目錄 5</p

18、><p><b>  };</b></p><p>  struct OpenTable</p><p>  { struct OpenTableItem</p><p>  {char name[9]; //文件名</p><

19、;p>  int firstdisk; //起始盤塊號</p><p>  int size; //文件的大小</p><p>  char open_flag; //文件打開標志:'1&#

20、39;:打開。'0':未打開</p><p>  }openitem[MOFN]; //最大文件打開數(shù) 5</p><p>  int cur_size; //當前打文件的數(shù)目</p><p><b>

21、;  };</b></p><p>  struct FatItem *fat; //FAT表</p><p>  struct Direct *root; //根目錄</p><p>  struct Direct *cur_di

22、r; //當前目錄</p><p>  struct OpenTable user_openTable; //文件打開表</p><p>  int fd=-1; //文件打開表的序號</p>&

23、lt;p>  char *bufferdir; //記錄當前路徑的名稱</p><p>  char *fdisk; //虛擬磁盤起始地址</p><p>  int cur_user;</p><p>  int

24、 find_N = 0;</p><p>  void init();</p><p>  void format();</p><p>  void enter();</p><p>  void assign();</p><p>  int create(char *name);</p><

25、;p>  int open(char *name);</p><p>  int close(char *name);</p><p>  int rename();</p><p>  int write(int fd,char *buf,int len,char *name);</p><p>  int read(int fd,c

26、har *buf,char *name);</p><p>  int del(char *name);</p><p>  void dir();</p><p>  int login();</p><p>  void helpMenu();</p><p>  void currentPath();</p

27、><p>  2、FileSystem.cpp</p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #include"conio.h"</p><p>  #include "FileSy

28、stem.h"</p><p>  #include<string.h></p><p>  int statue=0;</p><p>  char user[20]="li";</p><p>  char password[20]="123";</p><

29、p>  int main()</p><p>  { FILE *fp;</p><p><b>  char ch;</b></p><p>  char cmd[13];</p><p>  char name[10];</p><p>  int i,flag;</p&

30、gt;<p>  char *contect;</p><p>  helpMenu();</p><p>  while((flag=login())!=LOGIN)</p><p>  { printf("密碼不正確!\n");</p><p>  printf("請輸入正確的用戶名和密碼!\n

31、");</p><p><b>  }</b></p><p>  contect = (char *)malloc(MAX_WRITE*sizeof(char)); </p><p>  if((fp=fopen("disk.bat","rb"))==NULL) //創(chuàng)建

32、一個文件</p><p><b>  {</b></p><p>  printf(" Will you initialize the disk? (y or n)");</p><p>  scanf("%s",&ch);</p><p>  if(ch=='y&

33、#39;)</p><p>  { init();</p><p>  printf(" Initialize Succeed! \n");}</p><p><b>  else</b></p><p>  {return 0;}</p><p><b&g

34、t;  }</b></p><p>  enter(); </p><p><b>  //分析命令</b></p><p><b>  while(1)</b></p><p>  { printf("%s/>",bufferdir); <

35、;/p><p>  scanf("%s",cmd);</p><p>  if(strcmp(cmd,"help") == 0 || strcmp(cmd,"?") == 0)</p><p>  { helpMenu();}</p><p>  elseif(strcmp(cmd,

36、"model") == 0)</p><p>  { printf("需要修改密碼么(y/n)");</p><p>  scanf("%s",&ch);</p><p>  if (ch=='y')</p><p>  {printf(&quo

37、t;請輸入密碼\b");</p><p>  scanf("%s",&password);</p><p>  printf("修改成功");}</p><p><b>  else</b></p><p>  {printf("退出修改密碼\n&quo

38、t;);}</p><p><b>  }</b></p><p>  elseif(strcmp(cmd,"login") == 0)</p><p>  { while (login()!=LOGIN)</p><p>  {printf("請輸入正確的用戶名或密碼

39、\n");}</p><p><b>  }</b></p><p>  elseif(strcmp(cmd,"quit") == 0)</p><p>  { free(contect);</p><p><b>  exit(1);</b></p&g

40、t;<p><b>  return 0;</b></p><p><b>  }</b></p><p>  else if(strcmp(cmd,"create") == 0) </p><p>  { scanf("%s",name);</p&g

41、t;<p>  flag = create(name);</p><p>  //關于創(chuàng)建文件共實現(xiàn)四個判斷 </p><p>  if(flag==NAME_LONG)</p><p><b>  {//文件名太長</b></p><p>  printf("Error: \n 文件的名稱太長

42、!\n");}</p><p>  else if(flag==DIR_FULL)</p><p>  {//目錄下文件數(shù)超</p><p>  printf("Error: \n 該目錄下的文件和目錄數(shù)已滿 !\n");}</p><p>  else if(flag==ALREADY)</p>

43、<p><b>  {//重名</b></p><p>  printf("Error: \n 該目錄下已存在該文件 !\n");}</p><p>  else if(flag==DISK_FULL)</p><p><b>  {//磁盤空間滿</b></p><p&g

44、t;  printf("Error: \n 磁盤空間已滿!\n");}</p><p><b>  else</b></p><p>  {printf(" 成功創(chuàng)建文件! \n");}</p><p><b>  }</b></p><p>  else

45、 if(strcmp(cmd,"open") ==0)</p><p>  { statue=1;</p><p>  scanf("%s",name);</p><p>  fd = open(name);</p><p>  if(fd == NOT_EXSIT)</p>

46、<p>  {printf("Error: \n 所要打開的文件不存在! \n");}</p><p><b>  else</b></p><p>  {printf("打開成功! \n");}</p><p><b>  }</b></p><p&

47、gt;  else if(strcmp(cmd,"write") == 0)</p><p>  { statue=2;</p><p>  scanf("%s",name);</p><p>  if(fd == NOT_OPEN)</p><p><b>  {</b&g

48、t;</p><p>  printf("Error:\n 該文件沒有打開,請打開后再寫入 \n");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><

49、;p>  printf("請輸入文件的內(nèi)容: ");</p><p>  scanf("%s",contect); //connect為一個長度為128字節(jié)的變量值</p><p>  flag=write(fd,contect,strlen(contect),name);</p><p>  i

50、f(flag == 0) //每個盤塊可寫入最多128字節(jié)</p><p><b>  {</b></p><p>  printf("已成功寫入! \n");</p><p><b>  }</b></p><p><b>  e

51、lse</b></p><p><b>  {</b></p><p>  printf("Error:\n 硬盤空間不足,無法寫入! \n");</p><p><b>  }</b></p><p><b>  }</b></p>

52、<p><b>  }</b></p><p>  else if(strcmp(cmd,"read") == 0)</p><p><b>  {</b></p><p><b>  statue=3;</b></p><p>  scanf

53、("%s",name);</p><p>  fd = open(name);</p><p>  if(fd == NOT_EXSIT)</p><p><b>  {</b></p><p>  printf("Error:\n 不存在該文件,不能讀! \n");</p&

54、gt;<p><b>  }</b></p><p>  else if (fd == NOT_OPEN)</p><p><b>  {</b></p><p>  printf(" 該文件已經(jīng)打開! \n");</p><p><b>  }</

55、b></p><p><b>  else</b></p><p><b>  {</b></p><p>  flag = read(fd,contect,name);</p><p>  if(flag == 0)</p><p><b>  {</

56、b></p><p>  for(i=0;i<user_openTable.openitem[fd].size;i++) </p><p>  { </p><p>  printf("%c",contect[i]);</p>&l

57、t;p><b>  }</b></p><p>  printf("\t\n");</p><p>  //if(gets(a)==NULL);</p><p><b>  }</b></p><p><b>  }</b></p>

58、<p><b>  }</b></p><p>  else if(strcmp(cmd,"delete") == 0)</p><p><b>  {</b></p><p>  scanf("%s",name);</p><p>  flag =

59、 del(name);</p><p>  if(flag == NOT_EXIT)</p><p><b>  {</b></p><p>  printf("Error:\n 該文件沒有退出,不能刪除! \n");</p><p><b>  }</b></p>

60、<p>  else if(flag == -NOT_OPEN)</p><p><b>  {</b></p><p>  printf("Error:\n 該文件是打開的,請先關閉它,然后再刪除! \n");</p><p><b>  }</b></p><p>

61、;<b>  else</b></p><p><b>  {</b></p><p>  printf("已成功刪除文件! \n");</p><p><b>  }</b></p><p><b>  }</b></p>

62、<p>  else if(strcmp(cmd,"dir") ==0)</p><p><b>  {</b></p><p><b>  dir();</b></p><p><b>  }</b></p><p>  else if(st

63、rcmp(cmd,"format") == 0)</p><p><b>  {</b></p><p><b>  format();</b></p><p>  puts("format success!");</p><p><b>  }&l

64、t;/b></p><p>  else if(strcmp(cmd,"close") == 0)</p><p><b>  {</b></p><p><b>  statue=0;</b></p><p><b>  int i;</b><

65、/p><p>  for(i=0;i<MOFN;i++)</p><p><b>  {</b></p><p>  if(!strcmp(user_openTable.openitem[i].name, name))</p><p><b>  break;</b></p><

66、;p><b>  }</b></p><p>  if(i>=MOFN)</p><p>  printf("Error:\n 該文件沒有打開,無需關閉!\n");</p><p><b>  else</b></p><p><b>  {</b&g

67、t;</p><p>  //清空該文件的用戶打開表項</p><p>  strcpy(user_openTable.openitem[i].name,""); </p><p>  user_openTable.openitem[i].firstdisk = -1;</p><

68、p>  user_openTable.openitem[i].size = 0;</p><p>  user_openTable.openitem[i].open_flag = '0';</p><p>  user_openTable.cur_size--;</p><p>  printf("%s","clo

69、se success!\n");</p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else if (strcmp(cmd,"rename")

70、 == 0)</p><p><b>  {</b></p><p>  if (statue>=1)</p><p><b>  {</b></p><p>  printf("打開文件不能重命名");</p><p><b>  }&l

71、t;/b></p><p><b>  else{</b></p><p>  printf("%d",statue);</p><p>  flag=rename();</p><p>  if (flag==NOT_EXIT)</p><p><b>  {

72、</b></p><p>  printf("文件不存在\n");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>

73、  else{</b></p><p>  printf("\n 指令錯誤! \n");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p&g

74、t;  int login()</p><p><b>  {</b></p><p>  char inuser[20];</p><p>  char inpassword[20];</p><p><b>  char ch;</b></p><p><b>

75、  int j=0;</b></p><p>  printf("請輸入用戶名\n");</p><p>  scanf("%s",inuser);</p><p>  while((strcmp(inuser,user)!=0))</p><p><b>  {</b>

76、;</p><p>  printf("該用戶不存在!\n");</p><p>  printf("***************\n");</p><p>  printf("請輸入正確的用戶名:\n");</p><p>  scanf("%s",inuse

77、r);</p><p><b>  }</b></p><p>  printf("請輸入密碼\n");</p><p>  while((ch=getch())!=13) //將輸入的密碼轉(zhuǎn)換成字符****</p><p><b>  { </b></p>

78、<p>  putchar('*');</p><p>  inpassword[j]=ch;</p><p><b>  j++;</b></p><p><b>  }</b></p><p>  inpassword[j]='\0'; //字符數(shù)

79、組的最后一位為'\0',故要加該語句</p><p>  //printf("您輸入的密碼是:%s",inpassword);</p><p>  printf("\n");</p><p>  getchar();</p><p>  if ((strcmp(inuser,user)=

80、=0)&&(strcmp(inpassword,password)==0))</p><p><b>  {</b></p><p>  bufferdir="wang";</p><p>  return LOGIN;</p><p><b>  }</b>&l

81、t;/p><p><b>  else</b></p><p><b>  {</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b

82、></p><p>  void init()</p><p><b>  {</b></p><p>  fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); //分配空間</p><p>  format(); </p><p>&l

83、t;b>  }</b></p><p>  void format()</p><p><b>  {</b></p><p><b>  int i;</b></p><p><b>  FILE *fp;</b></p><p> 

84、 fat = (struct FatItem *)(fdisk+DISKSIZE); //FAT 1M</p><p>  /*-----初始化FAT表 fat[1]---fat[7]------------*/</p><p>  for(i=1;i<ROOT_DISK_NO-1;i++) //for(i=1;i<8;i++)

85、 </p><p>  { </p><p>  fat[i].item=i+1; </p><p>  fat[i].em_disk='1';

86、 </p><p>  } </p><p>  for(i=ROOT_DISK_NO;i<DISK_NUM;i++) //for(8;i<1024;i++) </p><p>  {

87、 </p><p>  fat[i].item = -1; //item為-1即表示還沒有使用</p><p>  fat[i].em_disk = '0';</p><p><b>  }</b

88、></p><p>  root = (struct Direct *)(fdisk+DISKSIZE+FATSIZE); //根目錄的地址 1k+8k</p><p>  root->directItem[0].sign = 1; //根目錄</p><p>  root->directItem[

89、0].firstDisk = ROOT_DISK_NO ; // = 9; //第9個盤塊開始</p><p>  strcpy(root->directItem[0].name,"."); //定義其文件名為 '.'</p><p>  root->directItem[0].ne

90、xt = root->directItem[0].firstDisk; //子目錄的起始盤塊是根目錄所在第一個盤塊,即未出</p><p><b>  //第一塊</b></p><p>  root->directItem[0].property = '1'; //1根目錄</p><

91、p>  root->directItem[0].size = ROOT_DISK_SIZE; //即一個根目錄項的空間大小 196字節(jié)</p><p>  /*指向上一級目錄的目錄項-----回指指針*/</p><p>  root->directItem[1].sign = 1;</p><p>  root->dire

92、ctItem[1].firstDisk = ROOT_DISK_NO;</p><p>  strcpy(root->directItem[1].name,"..");</p><p>  root->directItem[1].next = root->directItem[0].firstDisk;</p><p>  ro

93、ot->directItem[1].property = '1';</p><p>  root->directItem[1].size = ROOT_DISK_SIZE;</p><p>  for(i=2;i<MSD+2;i++) </p><p>  {

94、 //子目錄最大只有5個表項</p><p>  root->directItem[i].sign = 0;</p><p>  root->directItem[i].firstDisk = -1; </p><p>  strcpy(root->d

95、irectItem[i].name,""); </p><p>  root->directItem[i].next = -1;</p><p>  root->directItem[i].property = '0';</p><p>  root->directItem[i].size = 0

96、;</p><p><b>  }</b></p><p>  if((fp = fopen("disk.bat","wb"))==NULL)</p><p><b>  {</b></p><p>  printf("Error:\n Can

97、9;t Open The File \n");</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  //虛擬到物理</b></p><p>  if(fwrite(fdisk,MEM_D_SIZE,1

98、,fp)!=1) </p><p>  { </p><p>  printf("Error:\n 文件寫入錯誤! \n");</p><p><b>  }</b></p><p>

99、;  fclose(fp);</p><p><b>  }</b></p><p>  void enter()</p><p><b>  {</b></p><p><b>  FILE *fp;</b></p><p><b>  in

100、t i;</b></p><p>  //重新回到初始空間---虛擬中操作 </p><p>  fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); //申請 1M空間</p><p>  //判斷disk文件是否存在</p><p>  if((fp=fopen("d

101、isk.bat","rb"))==NULL)</p><p><b>  {</b></p><p>  printf("Error:\n 打開文件出錯!\n");</p><p><b>  return;</b></p><p><b>

102、;  }</b></p><p>  if(!fread(fdisk,MEM_D_SIZE,1,fp)){ //把磁盤文件disk.dat 讀入虛擬磁盤空間(內(nèi)存)</p><p>  //回到新申請的fdisk中</p><p>  printf("Error:\n 不能讀文件!\n");</p&g

103、t;<p><b>  exit(0); </b></p><p><b>  }</b></p><p>  fat = (struct FatItem *)(fdisk+DISKSIZE); </p><p>  root = (struct Direct *)(fdisk+DISKSIZE

104、+FATSIZE);</p><p>  fclose(fp);</p><p>  //最多能打開5個文件</p><p>  for(i=0;i<MOFN;i++) </p><p><b>  { </b></p><p>  s

105、trcpy(user_openTable.openitem[i].name,""); </p><p>  user_openTable.openitem[i].firstdisk = -1;</p><p>  user_openTable.openitem[i].size = 0;</p><p><b>  }</b

106、></p><p>  user_openTable.cur_size = 0;</p><p>  cur_dir = root; </p><p>  bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char)); </p><

107、p>  strcpy(bufferdir,"Root:"); </p><p><b>  }</b></p><p>  int create(char *name)</p><p><b>  {</b></p><p><

108、;b>  int i,j;</b></p><p>  //文件名超過8字符</p><p>  if(strlen(name)>8) //文件名大于 8位</p><p>  return(NAME_LONG); </p&g

109、t;<p><b>  //重名check</b></p><p>  for(j=2;j<MSD+2;j++) </p><p><b>  {</b></p><p><b>  //如果同名則跳出</b></p&g

110、t;<p>  if(!strcmp(cur_dir->directItem[j].name,name) && cur_dir->directItem[j].property=='0')</p><p>  break; </p><p><b>  }</b><

111、/p><p>  //如果沒循環(huán)完,則是因為文件已存在</p><p>  if(j<MSD+2) //文件已經(jīng)存在</p><p>  return(ALREADY);</p><p>  //超過最大文件數(shù)目</p><p>  for(

112、i=2;i<MSD+2;i++) //找到第一個空閑子目錄</p><p><b>  {</b></p><p>  if(cur_dir->directItem[i].firstDisk==-1) //找到?jīng)]有用到的</p><p><b>  bre

113、ak;</b></p><p><b>  }</b></p><p>  if(i>=MSD+2) //無空目錄項</p><p>  return(-2);</p><p>  for(j=ROOT_DISK_NO+1;j&l

114、t;DISK_NUM;j++) //找到空閑盤塊 j 后退出</p><p><b>  {</b></p><p>  if(fat[j].em_disk=='0') //為所創(chuàng)建的文件分配盤塊</p><p>  break;

115、 //此文件的大小應該是不加分配大小的,而是默認占用一個盤塊</p><p>  } //確實如此</p><p>  if(j>=DISK_NUM)</p><p>  return(DISK_FULL);</

116、p><p>  fat[j].em_disk = '1'; //將空閑塊置為已經(jīng)分配</p><p><b>  //填寫目錄項</b></p><p>  strcpy(cur_dir->directItem[i].name,name);</p><

117、p>  cur_dir->directItem[i].firstDisk = j;</p><p>  cur_dir->directItem[i].size = 0;</p><p>  cur_dir->directItem[i].next = j;</p><p>  cur_dir->directItem[i].property

118、 = '0';</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  int open(char *name)</p><p><b>  {</b></p><p><

119、b>  int i, j;</b></p><p>  for(i=2;i<MSD+2;i++) //文件是否存在,以文件名為標準</p><p><b>  {</b></p><p>  if(!strcmp(cur_dir->directItem[i

120、].name,name)) </p><p><b>  break;</b></p><p><b>  }</b></p><p>  if(i>=MSD+2)</p><p>  return(NOT_EXSIT); <

121、;/p><p>  //查找一個空閑用戶打開表項</p><p>  for(j=0;j<MOFN;j++) //根目錄下最多占用5個文件</p><p><b>  {</b></p><p>  if(user_openTable.openitem[j]

122、.firstdisk==-1)</p><p><b>  break;</b></p><p><b>  }</b></p><p>  //填寫表項的相關信息</p><p>  user_openTable.openitem[j].firstdisk = cur_dir->direct

123、Item[i].firstDisk; //cur_dir 最多5個</p><p>  strcpy(user_openTable.openitem[j].name,name);</p><p>  user_openTable.openitem[j].size = cur_dir->directItem[i].size;</p><p>  user_op

124、enTable.openitem[j].open_flag = '1';</p><p>  user_openTable.cur_size++;</p><p>  //返回用戶打開表表項的序號</p><p>  return(j);</p><p><b>  }</b></p>&l

125、t;p>  int close(char *name)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0;i<MOFN;i++)</p><p><b>  {</b></p>

126、<p>  if(!strcmp(user_openTable.openitem[i].name, name))</p><p><b>  break;</b></p><p><b>  }</b></p><p>  if(i>=MOFN)</p><p>  return(

127、6);</p><p>  //清空該文件的用戶打開表項</p><p>  strcpy(user_openTable.openitem[i].name,""); </p><p>  user_openTable.openitem[i].firstdisk = -1;</p><

128、;p>  user_openTable.openitem[i].size = 0;</p><p>  user_openTable.openitem[i].open_flag = '0';</p><p>  user_openTable.cur_size--;</p><p><b>  return 0;</b>&l

129、t;/p><p><b>  }</b></p><p>  int write(int fd, char *buf, int len,char *name)</p><p><b>  {</b></p><p>  char *first;</p><p>  int rem

130、ain;</p><p>  int item, i, j, k;</p><p>  int ilen1, ilen2, modlen, temp;</p><p>  //讀取用戶打開表對應表項第一個盤塊號</p><p>  item = user_openTable.openitem[fd].firstdisk;</p>

131、<p>  //找到當前目錄所對應表項的序號</p><p>  for(i=2;i<MSD+2;i++)</p><p><b>  {</b></p><p>  if(cur_dir->directItem[i].firstDisk==item)</p><p><b>  bre

132、ak;</b></p><p><b>  }</b></p><p>  temp = i; //存放當前目錄項的下標</p><p>  while(fat[item].item!=-1)</p><p><b>  {</b></p><p>  ite

133、m = fat[item].item; /*-查找該文件的下一盤塊--*/</p><p><b>  }</b></p><p><b>  //計算文件地址</b></p><p>  first = fdisk+item*DISKSIZE+user_openTable.openitem[fd].size%DISKSI

134、ZE;</p><p>  remain = DISKSIZE-user_openTable.openitem[fd].size%DISKSIZE;</p><p>  //如果最后磁盤塊剩余的大小大于要寫入的文件的大小</p><p>  if(remain > len)</p><p><b>  {</b>&

135、lt;/p><p>  strcpy(first,buf);</p><p>  user_openTable.openitem[fd].size = user_openTable.openitem[fd].size+len;</p><p>  cur_dir->directItem[temp].size = cur_dir->directItem[tem

136、p].size+len;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  for(i=0; i<remain; i++)</p><p>  {/*寫

137、一部分內(nèi)容到最后一塊磁盤塊的剩余空間(字節(jié))*/</p><p>  first[i] = buf [i];</p><p><b>  }</b></p><p>  /*-----計算分配完最后一塊磁盤的剩余空間(字節(jié)) 還剩下多少字節(jié)未存儲-------*/</p><p>  ilen1 = len - rema

138、in;</p><p>  ilen2 = ilen1/DISKSIZE;</p><p>  modlen = ilen1%DISKSIZE;</p><p>  if(modlen>0)</p><p>  ilen2 = ilen2+1; /*--還需要多少塊磁盤塊-*/</p><p>  for(j=0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論