{
int i,t,dd;
if((i=sopen(name))==-1)/*文件不存在,无法写*/ { }
if(openfile.file[i].flag==0) { } t=0;
fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET); fread(buffer1,64,1,fc); while(t buffer1[openfile.file[i].write.bnum]=buff[t]; openfile.file[i].write.bnum++; openfile.file[i].length++; if(openfile.file[i].write.bnum>=64) { fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET); fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/ if((dd=allocate())==false) { openfile.file[i].write.bnum--; openfile.file[i].length--; printf(\无磁盘空间,部分信息丢失,写失败\\n\return (false); printf(\文件以读方式打开,不能写\\n\return (false); printf(\文件没有打开或不存在\\n\return (false); }/*if*/ fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET); fread(buffer1,64,1,fc); buffer1[openfile.file[i].write.dnumd]=dd; fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET); fwrite(buffer1,64,1,fc); openfile.file[i].write.dnum=dd; openfile.file[i].write.bnum=0; }/*if*/ t++; }/*while*/ fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET); fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/ }/*写函数结束*/ int search(char *name,int flag,int *dnum,int *bnum) /*查找路径名为name的文件或目录,返回该目录的起始盘块号 */ //char *name; //int flag; /*flag=8表示查找目录,否则为文件*/ //int *dnum,*bnum;/*返回找到文件或目录的目录项的位置:盘块dnum中第bnum项*/ { for(s=0;name[k]!='.'&&name[k]!='/'&&s<3&&name[k]!='\\0';s++,k++) pna[s]=name[k]; pna[s]=' '; for(;s<3;s++)/*用空格补全名字长度*/ int k,i,s,j,last=0; char pna[3],type[2]; if((strcmp(name,\ return(2); 根 目 录 */ //P175 k=0; if(name[0]=='/')k=1; i=2; /*i=根目录的起始盘块号*/ while(last!=1) { /*pna=从name中分离出\后一个目录名(或文件名)*/ */ & while(name[k]!='.'&&name[k]!='\\0'&&name[k]!='/')/*除去多余字符 k++; type[0]=type[1]=' '; if(name[k]=='.')/*取文件类型名type*/ if(flag==8) { } else {/*文件遇到类型名认为结束,后面的字符作废*/ } else if(name[k]!='\\0')k++; if(name[k]=='\\0') last=1; /*查找目录且名字等于pna的目录项*/ fseek(fc,i*64L,SEEK_SET); fread(buffer2,64L,1,fc); j=0; if(last==1&&flag!=8) k++; if(name[k]!='\\0')type[0]=name[k]; k++; if(name[k]!='\\0')type[1]=name[k]; if(name[k]!='\\0'&&name[k+1]!='\\0') { } last=1; printf(\文件名错误\\n\return(false); printf(\目录不应该有有类型名,查找失败\\n\return(false); while(j<8&&!(buffer2[j].attribute!=8&&buffer2[j].name[0]==pna[0]& j++; buffer2[j].name[1]==pna[1]&&buffer2[j].name[2]==pna[2]&& buffer2[j].type[0]==type[0]&&buffer2[j].type[1]==type[1])) else while(j<8&&!(buffer2[j].attribute==8&&buffer2[j].name[0]==pna[0]& &&buffer2[j].name[2]==pna[2])) j++; if(last==1)/*查找结束*/ { *dnum=i; *bnum=j; return(buffer2[j].address); &buffer2[j].name[1]==pna[1] if(j<8)/*找到该目录或文件*/ } else/*查找还未结束*/ i=buffer2[j].address;/*读取下一个盘块*/ return(false); else //P176 }/*while 查找结束*/ }/*search()结束*/ int create_file(char *name,int attribute) /*建立文件函数,路径名name,文件属性attribute*/ //char *name; //int attribute; { int i,j,k,s,d,t,b,dd,dn,bn; char dname[3],tname[2],pathname[20]; OFILE x; if(attribute%2==1) { } if(openfile.length==n) { } /* 将name分成两部分,目录路径pathname和目录名dname*/ for(j=0;name[j]!='\\0';j++)/*查找最后一个“/”*/ if(name[j]=='/')s=j; /*分离目录路径*/ for(j=0;j pathname[j]=name[j]; pathname[j]='\\0'; /*分离文件名*/ for(k=0,j=s+1;name[j]!='\\0'&&k<3&&name[j]!='.';j++,k++) { } for(;k<3;k++) dname[k]=' '; k=0; if(name[j++]=='.')/*分离类型名*/ { } for(;k<2;k++) for(;name[j]!='\\0'&&k<2&&name[j]!='.';j++,k++) tname[k]=name[j]; printf(\错误文件名或目录名\\n\return(false); dname[k]=name[j]; if(k==0) printf(\已打开表已满,不能建立\\n\return(false); printf(\只读文件,无法写,不能建立\\n\return(false);
操作系统实习报告(磁盘文件操作)



