多用户多级目录文件系统的实现-操作系统 第4页

多用户多级目录文件系统的实现-操作系统 第4页
void Read(char *path)
{
 char display[BLOCK_SIZE];
 for (unsigned i = 0; i < FS.FI.FICount; i++)
 {
  if (!strcmp(FS.FI.FIStart[i].ParentName, CS.CurrParent->FileName)
&& FS.FI.FIStart[i].FileLevel == CS.FileLevel
&& FS.FI.FIStart[i].effect == 1
&& strcmp(FS.FI.FIStart[i].FileName, path) == 0)
  {
   FSElement *fselem = (FSElement *)
FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId);
   if (fselem->fileStu == closed)
   {
    strcpy(display, "文件尚未打开,请先打开文件。\n");
   }
   else
   {
    if (!fselem->FileData || !strcmp(fselem->FileData, ""))
    {
     strcpy(display, "文件无内容。\n");
    }
    else
    {
     strcpy(display, fselem->FileData);  
    }
    fselem->fileStu = reading;
   }   
   break;
  }
 }
 if (strcmp(display, "") == 0)
 {
  strcpy(display, "当前目录下没有您要打开的文件。\n");
 }
 printf("%s\n", display);
 printf("[%s@localhost %s]$", CS.CurrentUser.UserName, CS.CurrentPath);
}
4.1.6文件的写:write
只支持在当前目录进行操作,前提是用户已执行文件打开的命令,否则会提示用户先打开文件。命令成功后,会等待用户的输入,用户输入完毕,使用CTRL+D,结束输入,系统会读入用户的输入内容,保存到相应的文件块(注意,如果用户的输入太多,会出现越界或截取用户输入一部分的现象)。
void Write(char *path)
{
 char display[BLOCK_SIZE];
 memset(display, '\0', BLOCK_SIZE);
 for (unsigned i = 0; i < FS.FI.FICount; i++)
 {
  if (!strcmp(FS.FI.FIStart[i].ParentName, CS.CurrParent->FileName)
&&  FS.FI.FIStart[i].FileLevel == CS.FileLevel
&& FS.FI.FIStart[i].effect == 1
&& strcmp(FS.FI.FIStart[i].FileName, path) == 0)
  {
   FSElement *fselem = (FSElement *)
FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId);
   if (fselem->fileStu == closed)
   {
    strcpy(display, "文件尚未打开,请先打开文件。\n");
   }
   else
   {
    printf("\n注意:文件最大不可以超过 %d 字节!!按CTRL+D结
束编辑。\n", BLOCK_SIZE - sizeof(FSElement));
    char c;
    int i = 0;
    while ((c = getchar()) != 0x04)
    {
     display[i++] = c;
    }
    getchar(); //处理回车
    display[i] = '\0';
    strcpy(fselem->FileData, display); 
    unsigned len=strlen(display)<BLOCK_SIZE - sizeof(FSElement)
 ? strlen(display) :  BLOCK_SIZE - sizeof(FSElement);
    strncpy(fselem->FileData, display, len);
    fselem->fileStu = writing;
    strcpy(display, "文件写入成功。\n");
   }   
   break;
  }
 }
 printf("%s\n", display);
 printf("[%s@localhost %s]$", CS.CurrentUser.UserName, CS.CurrentPath);
}
4.1.7文件关闭:close
只支持在当前目录进行操作,通过用户给定的文件名在文件索引中搜索到文件的物理文件块ID,找到该文件元素后,将文件当前状态置为关闭。
void Close(char *path)
{
 char display[100];
 for (unsigned i = 0; i < FS.FI.FICount; i++)
 {
  if (!strcmp(FS.FI.FIStart[i].ParentName, CS.CurrParent->FileName)
&&  FS.FI.FIStart[i].FileLevel == CS.FileLevel
&& FS.FI.FIStart[i].effect == 1
&& strcmp(FS.FI.FIStart[i].FileName, path) == 0)
  {
   FSElement *fselem = (FSElement *)
FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId);
   fselem->fileStu = opened;
   strcpy(display, "文件已关闭。\n");
   break;  }
 }
 if (strcmp(display, "") == 0)
 {
  strcpy(display, "当前目录下没有您要关闭的文件。\n");
 }
 printf("%s\n", display);
 printf("[%s@localhost %s]$", CS.CurrentUser.UserName, CS.CurrentPath);
}
4.1.8删除文件:delete
删除文件并不真正清理文件的物理存储内容,只是将文件的有效状态更改为无效。

上一页  [1] [2] [3] [4] [5] [6] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有