📄 os.cpp
字号:
printf("成功创建文件!\n\n");
printf("===========================================\n");
printf("文件名 长度 最大长度 类型 开始位置\n");//显示刚建立的文件
printf("%s ",temp.fileName);
printf("%d ",temp.length);
printf("%d ",temp.maxLength);
printf("%s ",temp.fileKind);
printf("%d ",temp.start);
printf("\n===========================================\n");
printf("create进程打开了文件%s,关闭请用close命令!\n\n",fileName);
//写到打开文件表
strcpy(OFT[OFT_count].fileName,temp.fileName);
strcpy(OFT[OFT_count].fileKind,temp.fileKind);
OFT[OFT_count].length=temp.length;
OFT[OFT_count].maxLength=temp.maxLength;
OFT[OFT_count].start=temp.start;
OFT[OFT_count].openCount=1;
OFT[OFT_count].timeinfo=temp.timeinfo;
OFT_count++; //打开表 记录的是文件数
//printf("count%d",OFT_count);
}
void fileDel(char *fileName)
{
int i;
int flag=0;
int k=0; //记录文件在 文件表中的位置
SLNode *p; //磁盘空间分配表 指针
SeqDataType x; //存储被删除的结点,无特殊意义
for(i=0;i<OFT_count;i++) //判断是否被别的进程占用,若被占用,打印出错,直接返回
if(!strcmp(fileName,OFT[i].fileName))
{
printf("别的进程占用文件!无法删除!");
return ;
}
for(i=0;i<L.size;i++)//从文件表里查找到要删除的文件,若查找不到,直接返回
{
if(!strcmp(fileName,L.list[i].fileName))
{
flag=1;
k=i;
break;
}
}
if(flag==0)
{
printf("无此文件!");
return ;
}
if(flag==1)//查找到文件后,把磁盘空间置为空闲,之后从文件表中删除
{
for(p=freeDiskTableHead;p->next!=NULL;p=p->next)
{
if(p->next->data.start==L.list[k].start)
{
p->next->data.useFlag=0;
printf("成功删除!\n");
break;
}
}
SeqListDelete(&L,k,&x);//从文件表中删除
}
}
void fileRead(char *fileName,int position,int length)
{
int i;
int flag=0;
int k=0;
for(i=0;i<OFT_count;i++) //查找文件打开表,如果存在,则不需要再查找文件表
{
if(!strcmp(fileName,OFT[i].fileName))
{
k=i;
flag=1;
OFT[i].openCount++;//多个进程打开,计算器加1
break;
}
}
if(flag!=1) //文件不在打开表,找到它,并写到打开表最后
{
for(i=0;i<L.size;i++)
{
if(!strcmp(fileName,L.list[i].fileName)) //找到文件,写到文件打开表
{
strcpy(OFT[OFT_count].fileName,L.list[i].fileName);
strcpy(OFT[OFT_count].fileKind,L.list[i].fileKind);
OFT[OFT_count].length=L.list[i].length;
OFT[OFT_count].maxLength=L.list[i].maxLength;
OFT[OFT_count].start=L.list[i].start;
OFT[OFT_count].timeinfo=L.list[i].timeinfo;
OFT[OFT_count].openCount++;
k=OFT_count;
//OFT_count=1;//初次打开,赋值为1
flag=1; //标志在打开文件表里
}
}
}
if(flag==1)
{
if(position<0||position+length>OFT[k].length)
{
printf("读取参数错误,请检查参数!\n");
return ;
}
for(i=0;i<length;i++)
printf("%c",disk[OFT[k].start+position+i-1]); //读取内容
printf("\nread进程打开了文件%s,关闭请用close命令!\n\n",fileName);
}
}
void fileWrite(char *fileName,int position,char *s)//找到文件,写到打开表,根据打开表操作
{
int i=0;
int len=0; //计算写入字串长度,跟原来长度相加,如果超过最大长度,就失败
int k=0; //如果在 打开表里打到记录,则记录位置
int flag=0; //如果flag=1,说明在打开表里找到了,不用在文件表里找了
len=strlen(s);
for(i=0;i<OFT_count;i++)
{
if(!strcmp(fileName,OFT[i].fileName))
{
k=i;
flag=1;
OFT[i].openCount++;//多个进程打开,计算器加1
break;
}
}
if(flag!=1) //文件不在打开表,找到它,并写到打开表最后
{
for(i=0;i<L.size;i++)
{
if(!strcmp(fileName,L.list[i].fileName)) //找到文件,写到文件打开表的最后
{
strcpy(OFT[OFT_count].fileName,L.list[i].fileName);
strcpy(OFT[OFT_count].fileKind,L.list[i].fileKind);
OFT[OFT_count].length=L.list[i].length;
OFT[OFT_count].maxLength=L.list[i].maxLength;
OFT[OFT_count].start=L.list[i].start;
OFT[OFT_count].timeinfo=L.list[i].timeinfo;
OFT[OFT_count].openCount++;
k=OFT_count; //记录在文件打开表中的位置
flag=1; //标志在打开文件表里
}
}
}
if(1==flag) //如果在打开表里 找到文件,则不用再找文件表
{
if(OFT[k].length+len>OFT[k].maxLength)
{
printf("超过文件最大长度,写入失败!\n");
return ;
}
else if(position<0||position>OFT[k].length)
{
printf("插入位置非法!请检查参数\n");
return ;
}
else
{
int j=0;
for(i=OFT[k].length-1;i>=OFT[k].start+position;i--)
disk[i+len]=disk[i]; //给插入的字符串 空出位置
for(i=OFT[k].start+position;i<OFT[k].start+position+len;i++,j++)
disk[i]=s[j]; //写进磁盘
for(i=0;i<L.size;i++) //改变文件长度
{
if(!strcmp(fileName,L.list[i].fileName))
{
L.list[i].length=L.list[i].length+len; //设置文件长度
break;
}
}
OFT[k].length=OFT[k].length+len; //同时更新打开文件表中文件的长度
printf("成功写入!\n");
printf("write进程打开了文件%s,关闭请用close命令!\n\n",fileName);
}
}
else
printf("无此文件,请输入正确的文件名!");
}
void fileAsk(char *fileName)
{
int i;
int flag=0;
for(i=0;i<OFT_count;i++) //如果在打开表里 找到文件,则不用再找文件表
{
if(!strcmp(fileName,OFT[i].fileName))
{
printf("文件名:%s\n",OFT[i].fileName);
printf("类型:%s\n",OFT[i].fileKind);
printf("长度:%d\n",OFT[i].length);
printf("打开进程数:%d\n",OFT[i].openCount);
printf("创建时间:%s\n",asctime(OFT[i].timeinfo));
flag=1;
break;
}
}
if(flag!=1)
{
for(i=0;i<L.size;i++) //从文件表里查找文件
{
if(!strcmp(fileName,L.list[i].fileName))
{
printf("文件名:%s\n",L.list[i].fileName);
printf("类型:%s\n",L.list[i].fileKind);
printf("长度:%d\n",L.list[i].length);
printf("创建时间:%s\n",asctime(L.list[i].timeinfo));
flag=1;
break;
}
}
}
if(flag==0)
printf("无此文件!\n");
}
void fileType(char *fileName)
{
int i;
int flag=0;
int k=0;
for(i=0;i<OFT_count;i++)
{
if(!strcmp(fileName,OFT[i].fileName))
{
k=i;
flag=1;
OFT[i].openCount++;//多个进程打开,计算器加1
break;
}
}
if(flag!=1) //文件不在打开表,找到它,并写到打开表最后
{
for(i=0;i<L.size;i++)
{
if(!strcmp(fileName,L.list[i].fileName)) //找到文件,写到文件打开表
{
strcmp(OFT[OFT_count].fileName,L.list[i].fileName);
strcmp(OFT[OFT_count].fileKind,L.list[i].fileKind);
OFT[OFT_count].length=L.list[i].length;
OFT[OFT_count].maxLength=L.list[i].maxLength;
OFT[OFT_count].start=L.list[i].start;
OFT[OFT_count].timeinfo=L.list[i].timeinfo;
OFT[OFT_count].openCount++;
k=OFT_count;
//OFT_count=1;//初次打开,赋值为1
flag=1; //标志在打开文件表里
}
}
}
if(flag==1)
{
for(i=0;i<OFT[k].length;i++)
printf("%c",disk[OFT[k].start+i]); //显示全部内容
if(OFT[k].length==0)
printf("文件为空,无内容显示!\n");
printf("\n===========================================\n");
printf("\ncreate进程打开了文件%s,关闭请用close命令!\n\n",fileName);
// printf(",,,,\n");
// printf("OFT[k].length %d\n",OFT[k].length);
}
else
printf("无此文件,请检查文件名!\n");
}
void fileRen(char *fileName,char *newName)
{
int i=0;
int flag=0;
for(i=0;i<OFT_count;i++) //若还有别的进程打开文件,刚不能重命名
if(!strcmp(fileName,OFT[i].fileName))
{
printf("别的进程占用文件!无法重命名!\n");
return ;
}
for(i=0;i<L.size;i++) //在文件表里找到,并重命名
if(!strcmp(fileName,L.list[i].fileName))
{
strcpy(L.list[i].fileName,newName);
flag=1;
break;
}
if(flag==1)
printf("重命名成功!\n");
else
printf("重命名失败!无此文件\n");
}
void fileDir()
{
int i;
if(L.size==0) //文件表的 大小为0,说明没有文件
{
printf("磁盘无文件!\n");
return ;
}
for(i=0;i<L.size;i++) //打印所有文件名
printf("%s\n",L.list[i].fileName);
}
void fileClose(char *fileName)
{
int i;
int flag=0;
int j;
for(i=0;i<OFT_count;i++)
{
if(!strcmp(fileName,OFT[i].fileName)) //在文件打开表里找到,把打开数减1,
//如果计数为0,显示关闭成功!
{
OFT[i].openCount--;
flag=1;
if(OFT[i].openCount==0)
{
for(j=i;j<OFT_count;j++)
OFT[j]=OFT[j+1]; //删除要关闭的文件
OFT_count--;
printf("成功关闭文件!\n");
}
else
printf("计数器减1\n");
break;
}
}
if(flag==0)
printf("此文件没有打开!\n");
}
///////////////////////////////
//磁盘空间管理 操作
int requestDisk(int *startPosistion,int *maxLength)
{
struct freeDiskTable temp;
int flag=0; //分配成功与否标志
int k=0; //记录插入位置
SLNode *p=NULL;
for(p=freeDiskTableHead;p->next!=NULL;p=p->next)
{
k++;//记录位置,在空闲结点之后插入结点
if(p->next->data.useFlag==0&&p->next->data.maxLength>=*maxLength)
{
temp.length=0;
temp.maxLength=p->next->data.maxLength-*maxLength;
temp.start=p->next->data.start+*maxLength;
temp.useFlag=0; //分解节点
//=========================================
p->next->data.maxLength=*maxLength;
p->next->data.useFlag=1; //设置分配的空间标志位
*startPosistion=p->next->data.start;
flag=1;//成功分配
break;
}
}
if(1==flag) //成功分配空间,返回成功标志
{
if(!LinListInsert(freeDiskTableHead,k,temp))
{
printf("失败!\n");
system("pause");
exit(0);
}
return 1;
}
else
return 0;
}
///////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -