?? 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 + -