QQ登录

只需一步,快速开始

文件操作例程,纯C++ 编写

[ 复制链接 ]

文件操作例程,纯C++ 编写

文件操作例程,纯C++ 编写

可以看到程序运行的界面。
DOC环境运行,通过输入数值执行对应功能。
别人写的,就两个文件,内容如下。
可以参考使用。
  1. #include "stdio.h"
  2. #include "conio.h"
  3. #include "stdlib.h"
  4. #include <string.h>

  5. #define false 0
  6. #define true 1
  7. #define n 5 /*模拟实验中系统允许打开文件的最大数量*/


  8. class Content /*目录结构*/
  9. {
  10.         public:
  11.         char name[3]; /*文件或目录名*/
  12.         char type[3]; /*文件类型名*/
  13.         char attribute; /*属性*/
  14.         char address; /*文件或目录的起始盘块号*/
  15.         char length; /*文件长度,以盘块为单位*/
  16. };

  17. /*已打开文件表中读写指针的结构*/
  18. class Pointer
  19. {
  20. public:
  21.         int dnum; /*磁盘盘块号*/
  22.         int bnum; /*盘块内第几项*/
  23. };

  24. /*已打开文件表项类型定义*/
  25. class OFILE
  26. {
  27. public:
  28.         char name[20]; /*文件绝对路径名*/
  29.         char attribute;/*文件的属性,用1个字节表示,所以用了char类型*/
  30.         int number; /*文件起始盘块号*/
  31.         int length; /*文件长度,文件占用的字节数*/
  32.         int flag; /*操作类型,用"0"表示以读操作方式开文件,用"1"表示写操作方式打开文件*/
  33.         Pointer read; /*读文件的位置,文件刚打开时dnum为文件起始盘块号,bnum为"0"*/
  34.         Pointer write; /*写文件的位置,文件建立时dnum为文件起始盘块号,bnum为"0",打开时为文件末尾*/
  35. };

  36. /*已打开文件表定义*/
  37. class OpenFile
  38. {
  39. public:
  40.    OFILE file[n]; /*已打开文件表*/
  41.    int length; /*已打开文件表中登记的文件数量*/
  42. };
  43. char buffer1[64];/*模拟缓冲1*/
  44. Content buffer2[8];/*模拟缓冲2*/
  45. FILE *fc; /*模拟磁盘的文件指针*/
复制代码
  1. #include "FileSystem.h"
  2. Content content;
  3. Pointer ponter;                     
  4. OFILE ofile;
  5. OpenFile openfile;

  6. //文件操作
  7. /*查找路径名为name的文件或目录,返回该目录的起始盘块号 */
  8. int search(char name[],int flag,int *dnum,int *bnum)/*flag=8表示查找目录,否则为文件*//*返回找到文件或目录的目录项的位置:盘块dnum中第bnum项*/
  9. {
  10.         int k,i,s,j,last=0;
  11.         char pna[3],type[3];
  12.         if((strcmp(name,"")==0)||(strcmp(name,"/")==0))/*根目录*/
  13.                 return(2);
  14.         k=0;
  15.         if(name[0]=='/')k=1;
  16.         i=2; /*i=根目录的起始盘块号*/
  17.         while(last!=1)
  18.         {
  19.                 /*pna=从name中分离出"/"后一个目录名(或文件名)*/
  20.                 for(s=0;name[k]!='.'&&name[k]!='/'&&s<3&&name[k]!='\0';s++,k++)
  21.                         pna[s]=name[k];
  22.                 for(;s<3;s++)/*用空格补全名字长度*/
  23.                         pna[s]=' ';
  24.                 while(name[k]!='.'&&name[k]!='\0'&&name[k]!='/')/*除去多余字符*/
  25.                         k++;
  26.                 type[0]=type[1]=' ';
  27.                 if(name[k]=='.')/*取文件类型名type*/
  28.                         if(flag==8)
  29.                         {
  30.                                 printf("Dir shouldn't contain file type,failed!\n\n");
  31.                                 return(false);
  32.                         }
  33.                         else
  34.                         {/*文件遇到类型名认为结束,后面的字符作废*/
  35.                                 k++;
  36.                                 if(name[k]!='\0')
  37.                                         type[0]=name[k];
  38.                                 k++;
  39.                                 if(name[k]!='\0')
  40.                                         type[1]=name[k];
  41.                                 k++;
  42.                 if(name[k]!='\0')
  43.                                         type[2]=name[k];
  44.                                
  45.                                 if(name[k]!='\0'&&name[k+1]!='\0')
  46.                                 {
  47.                                         printf("Wrong file name!\n\n");
  48.                                         return(false);
  49.                                 }
  50.                                 last=1;
  51.                         }
  52.                         else
  53.                                 if(name[k]!='\0')
  54.                                         k++;
  55.                                 if(name[k]=='\0')
  56.                                         last=1;
  57.                                 /*查找目录且名字等于pna的目录项*/
  58.                                 fseek(fc,i*64L,SEEK_SET);
  59.                                 fread(buffer2,64L,1,fc);
  60.                                 j=0;
  61.                                 if(last==1&&flag!=8)
  62.                                         while(j<8&&!(buffer2[j].attribute!=8&&buffer2[j].name[0]==pna[0]&&
  63.                         buffer2[j].name[1]==pna[1]&&buffer2[j].name[2]==pna[2]&&
  64.                         buffer2[j].type[0]==type[0]&&buffer2[j].type[1]==type[1]&&buffer2[j].type[2]==type[2]))
  65.                         j++;
  66.                                         else
  67.                         while(j<8&&!(buffer2[j].attribute==8&&buffer2[j].name[0]==pna[0]&&buffer2[j].name[1]==pna[1]
  68.                                                         &&buffer2[j].name[2]==pna[2]))
  69.                                                         j++;
  70.                         if(j<8)/*找到该目录或文件*/
  71.                                                         if(last==1)/*查找结束*/
  72.                                                         {
  73.                                                                 *dnum=i;
  74.                                                                 *bnum=j;
  75.                                                                 return(buffer2[j].address);
  76.                                                         }
  77.                                                         else/*查找还未结束*/
  78.                                                                 i=buffer2[j].address;/*读取下一个盘块*/
  79.                                                         else
  80.                                                                 return(false);
  81.         }/*while 查找结束*/
  82.         return 1;
  83. }/*search()结束*/

  84. /*分配一个磁盘块,返回块号*/
  85. int allocate( )
  86. {
  87.         int i;
  88.         fseek(fc,0,SEEK_SET); /*将模拟磁盘的文件指针移至模拟磁盘FAT表*/
  89.         fread(buffer1,64L,1,fc);/*将FAT表中第一个磁盘块读入模拟缓冲buffer1中*/
  90.         for(i=3;i<63;i++)
  91.                 if(buffer1[i]==0)
  92.                 { /*FAT中的第i项为0,分配第i块磁盘块,修改FAT表,并且写回磁盘*/
  93.                         buffer1[i]=255;
  94.                         fseek(fc,0,SEEK_SET);
  95.                         fwrite (buffer1,64L,1,fc);
  96.                         return(i); /*返回磁盘号*/
  97.                 }
  98.                 fread(buffer1,64L,1,fc);/*将FAT表中第二个磁盘块读入模拟缓冲buffer1中*/
  99.                 for(i=0;i<63;i++)
  100.                         if(buffer1[i]==0)
  101.                         {/*FAT中的第i项为0,分配第i+64块磁盘块,修改FAT表,并且写回磁盘*/
  102.                                 buffer1[i]=255;
  103.                                 fseek(fc,-64L,SEEK_CUR);
  104.                                 fwrite(buffer1,64L,1,fc);
  105.                                 return(i+64); /*返回磁盘号*/
  106.                         }
  107.                         printf("Disk full,please clear file system!\n\n");
  108.                         return(false);
  109. }
  110. /*分配磁盘块函数结束*/  

  111. void copen(OFILE *x1,OFILE *x2)                     
  112. {
  113.     strcpy(x1->name,x2->name);
  114.     x1->attribute=x2->attribute;
  115.     x1->number=x2->number;
  116.     x1->length=x2->length;
  117.     x1->flag=x2->flag;
  118.     x1->read.dnum=x2->read.dnum;
  119.     x1->read.bnum=x2->read.bnum;
  120.     x1->write.dnum=x2->write.dnum;
  121.     x1->write.bnum=x2->write.bnum;
  122. }


  123. /*在已打开文件表中查找文件name*/
  124. int sopen(char name[])
  125. {
  126.         int i;
  127.         i=0;
  128.         while(i<openfile.length&&strcmp(openfile.file[i].name,name)!=0)/*依次查找已打开文件表*/
  129.                 i++;
  130.         if(i>=openfile.length)
  131.                 return(-1);
  132.         return(i);
  133. }/*查找sopen函数结束*/


  134. void dopen(char name[]) /*在已打开文件表中删除文件name*/
  135. {
  136.         int i;
  137.         i=sopen(name);
  138.         if(i==-1)
  139.                 printf("You need to open that file first!\n\n");
  140.         else
  141.         {
  142.                 copen(&openfile.file[i],&openfile.file[openfile.length-1]);
  143.                 openfile.length--;
  144.         }
  145. }/*删除函数结束*/

  146. /*在已打开文件表中插入文件name*/
  147. int iopen(OFILE *x)
  148. {
  149.         int i;
  150.         i=sopen(x->name);
  151.         if(i!=-1)
  152.         {
  153.                 printf("File is already open!\n\n");
  154.                 return(false);
  155.         }
  156.         else if(openfile.length==n)
  157.         {
  158.                 printf("Table of open file is full!\n\n");
  159.                 return(false);
  160.         }
  161.         else
  162.         {
  163.                 copen(&openfile.file[openfile.length],x);
  164.                 openfile.length++;
  165.                 return(true);
  166.         }
  167. }
  168. /*填写已打开文件表函数结束*/


  169. /*建立文件函数,路径名name,文件属性attribute*/
  170. int create_file(char name[])
  171. {
  172.         int i,j,k,s,d,t,b,dd,dn,bn;
  173.         int attribute=4;
  174.         char dname[3],tname[3],pathname[20];
  175.         OFILE x;
  176.         if(attribute%2==1)
  177.         {
  178.                 printf("Read only,can't write!\n\n");
  179.                 return(false);
  180.         }
  181.         if(openfile.length==n)
  182.         {
  183.                 printf("Table of open file is full,can't creat!\n\n");
  184.                 return(false);
  185.         }
  186.         /* 将name分成两部分,目录路径pathname和目录名dname*/
  187.         for(j=0;name[j]!='\0';j++) /*查找最后一个“/”*/
  188.                 if(name[j]=='/')
  189.                         s=j;
  190.                 /*分离目录路径*/
  191.                 for(j=0;j<s;j++)
  192.                         pathname[j]=name[j];
  193.                 pathname[j]='\0';
  194.                 /*分离文件名*/
  195.                 for(k=0,j=s+1;name[j]!='\0'&&k<3&&name[j]!='.';j++,k++)
  196.                         dname[k]=name[j];
  197.                 if(k==0)
  198.                 {
  199.                         printf("Wrong file name or dir!\n\n");
  200.                         return(false);
  201.                 }
  202.                 for(;k<3;k++)
  203.                         dname[k]=' ';
  204.                 k=0;
  205.                
  206.                 if(name[j++]=='.')/*分离类型名*/
  207.                 {
  208.                         for(;name[j]!='\0'&&k<5&&name[j]!='.';j++,k++)
  209.                                 tname[k]=name[j];
  210.                 }
  211.                
  212.                 for(;k<3;k++)
  213.                         tname[k]=' ';
  214.                 if((d=search(pathname,8,&dn,&bn))==false)/*找到目录路径,返回该目录所在块号dn和项数bn*/
  215.                 {
  216.                         printf("Dir isn't exist,can't creat!\n\n");
  217.                         return(false);
  218.                 }
  219.                 /*确认该目录不存在的同时查找空目录项*/
  220.                 b=-1;
  221.                
  222.                 fseek(fc,d*64L,SEEK_SET);
  223.                 fread(buffer2,64L,1,fc); /*读出dnum盘块的内容*/
  224.                 for(t=0;t<8;t++)
  225.                 {
  226.                         if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&buffer2[t].name[2]==dname[2]
  227.                                 &&buffer2[t].type[0]==tname[0]&&buffer2[t].type[1]==tname[1]&&buffer2[t].type[2]==tname[2])
  228.                         {   /*找到名字dname的文件,建立失败*/
  229.                                 printf("Already exist,can't creat!\n\n");
  230.                                 return(false);
  231.                         }
  232.                         if(buffer2[t].name[0]==' 文件操作例程,纯C++ 编写.rar (13.31 KB, 下载次数: 0, 售价: 1 金币)
  233. &&b==-1)
  234.                                 b=t;
  235.                 }/*for*/
  236.                
  237.                 if(b==-1)/*没有空目录项,建立失败*/
  238.                 {
  239.                         printf("Disk full,you should first clear file system!\n\n");
  240.                         return(false);
  241.                 }
  242.                 if((dd=allocate( ))==false)/*分配给建立目录的磁盘盘块dd*/
  243.                 {
  244.                         printf("Creat failed!\n\n");
  245.                         return(false);
  246.                 }
  247.                 /*填写目录项*/
  248.                 for(i=0;i<3;i++)
  249.                         buffer2[b].name[i]=dname[i];
  250.                 for(i=0;i<3;i++)
  251.                         buffer2[b].type[i]=tname[i];
  252.                 buffer2[b].attribute=attribute;
  253.                 buffer2[b].address=dd;
  254.                 buffer2[b].length=0;
  255.                 fseek(fc,d*64L,SEEK_SET);
  256.                 fwrite(buffer2,64L,1,fc);
  257.                 /*填写已打开文件表*/
  258.                 strcpy(x.name,name);
  259.                 x.attribute=attribute;
  260.                 x.number=dd;
  261.                 x.length=0;
  262.                 x.flag=1;
  263.                 x.read.dnum=x.write.dnum=dd;
  264.                 x.read.bnum=x.write.bnum=0;
  265.                 printf("Creat file successfully!\n\n");
  266.                 iopen(&x);
  267.                 return (true);
  268.                
  269. }/*建立文件结束*/

  270. /*打开文件函数*/
  271. int open_file(char name[],int attribute)
  272. {
  273.         OFILE x;
  274.         int dnum,bnum,last,i,d;
  275.         if((d=search(name,4,&dnum,&bnum))==false)
  276.         {
  277.                 printf("File isn't exist,open failed!\n");
  278.                 return(false);
  279.         }
  280.         fseek(fc,dnum*64L,SEEK_SET);/*读出对应目录项*/
  281.         fread(buffer2,64,1,fc);
  282.         if((buffer2[bnum].attribute%2==1)&&
  283.                 attribute==1)/*对只读文件要求写*/
  284.         {
  285.                 printf("Read only,open failed!\n\n");
  286.                 return(false);
  287.         }
  288.         strcpy(x.name,name);
  289.         x.attribute=buffer2[bnum].attribute;
  290.         x.number=buffer2[bnum].address;
  291.         x.read.dnum=x.write.dnum=buffer2[bnum].address;
  292.         x.read.bnum=x.write.bnum=0;
  293.         x.flag=attribute;
  294.         if(attribute==1)
  295.         {
  296.                 while(d!='\xff')/*寻找文件末尾*/
  297.                 {
  298.                         fseek(fc, d/64*64L, SEEK_SET);
  299.                         fread(buffer1,64L,1,fc);/*读出dnum项所在FAT*/
  300.                         last=d;
  301.                         d=buffer1[d%64];/*读出dnum块下一块内容赋给dnum*/
  302.                 }/*while*/
  303.                 x.write.dnum=last;/*填写写指针*/
  304.                 fseek(fc, last*64L, SEEK_SET);
  305.                 fread(buffer1,64L,1,fc);
  306.                 for(i=0;i<64&&buffer1[i]!='#';i++);
  307.                 x.write.bnum=i;
  308.                 x.length=(buffer2[bnum].length-1)*64+i;
  309.         }
  310.         iopen(&x);/*填写已打开文件表*/
  311.         printf("File opened successfully!\n\n");
  312.         return 1;
  313. }
  314. /*文件打开结束*/


  315. /*关闭文件函数*/
  316. int close_file(char name[])
  317. {
  318.         int i,dnum,bnum;
  319.         if((i=sopen(name))==-1)
  320.         {
  321.                 printf("You need first open it,close failed!\n\n");
  322.                 return(false);
  323.         }
  324.         if(openfile.file[i].flag==1)/*写文件的追加文件结束符*/
  325.         {
  326.                 fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);
  327.                 fread(buffer1,64,1,fc);
  328.                 buffer1[openfile.file[i].write.bnum]='#';
  329.                 fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);
  330.                 fwrite(buffer1,64,1,fc);
  331.                 fputc('#',fc);
  332.                 search(name,4,&dnum,&bnum);/*查找该文件目录位置*/
  333.                 /*修改目录中的文件长度*/
  334.                 fseek(fc,dnum*64L, SEEK_SET);
  335.                 fread(buffer2,64,1,fc);
  336.                 buffer2[bnum].length=openfile.file[i].length/64+1;
  337.                 fseek(fc, dnum*64L, SEEK_SET);
  338.                 fwrite(buffer2,64,1,fc);
  339.         }
  340.         /*在已打开文件表中删除该文件的登记项*/
  341.         if(openfile.length>1)
  342.                 copen(&openfile.file[i],&openfile.file[openfile.length-1]);
  343.         openfile.length--;
  344.         printf("File closed successfully!\n\n");
  345.         return 1;
  346. }

  347. /*读文件函数,文件路径名name,读取长度length*/
  348. int read_file(char name[])
  349. {
  350.         int i,t;
  351.         int length=20;
  352.         if((i=sopen(name))==-1)
  353.         {
  354.                 printf("You need to open it first or it isn't exist!\n\n");
  355.                 return(false);
  356.         }
  357.         if(openfile.file[i].flag==1)
  358.         {
  359.                 printf("Open in write mode! Please close it and open it in read mode!\n\n");
  360.                 return(false);
  361.         }
  362.         t=0;
  363.         fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);
  364.         fread(buffer1,64,1,fc);
  365.         while(t<length&&buffer1[openfile.file[i].read.bnum]!='#')
  366.         {
  367.                 putchar(buffer1[openfile.file[i].read.bnum]);/*读出一个字符(这里是在屏幕上显示)*/
  368.                 if((t+1)%64==0)putchar('\n');
  369.                 /*修改读指针*/
  370.                 openfile.file[i].read.bnum++;
  371.                 if(openfile.file[i].read.bnum>=64)/*一块读完,读取下一个盘块*/
  372.                 {
  373.                         fseek(fc,openfile.file[i].read.dnum/64*64, SEEK_SET);
  374.                         fread(buffer1,64,1,fc);
  375.                         openfile.file[i].read.dnum=buffer1[openfile.file[i].read.dnum%64];/*修改读指针*/
  376.                         openfile.file[i].read.bnum=0;
  377.                         fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);
  378.                         fread(buffer1,64,1,fc);/*读取下一个*/
  379.                 }
  380.                 t++;
  381.         }
  382.         printf("\n");
  383.         return 1;
  384. }
  385. /*读函数结束*/

  386. /*写文件函数*/
  387. int write_file(char name[],char buff[],int length)/*文件路径名 存放准备写入磁盘的内容 写入内容的长度*/
  388. {
  389.         int i,t,dd;
  390.         int d,dn,bn;
  391.        
  392.         if((i=sopen(name))==-1)/*文件不存在,无法写*/
  393.         {
  394.                 printf("You need to open it first or it isn't exist!\n\n");
  395.                 return(false);
  396.         }
  397.         if(openfile.file[i].flag==0)
  398.         {
  399.                 printf("Open in read mode,can't write!\n\n");
  400.                 return(false);
  401.         }
  402.         t=0;
  403.         fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);
  404.         fread(buffer1,64,1,fc);
  405.         while(t<length)
  406.         {
  407.                 buffer1[openfile.file[i].write.bnum]=buff[t];
  408.                 openfile.file[i].write.bnum++;
  409.                 openfile.file[i].length++;
  410.                 if(openfile.file[i].write.bnum>=64)
  411.                 {
  412.                         fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET);
  413.                         fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/
  414.                         if((dd=allocate())==false)
  415.                         {
  416.                                 openfile.file[i].write.bnum--;
  417.                                 openfile.file[i].length--;
  418.                                 printf("Disk full,some info missing,failed!\n\n");
  419.                                 return(false);
  420.                         }/*if*/
  421.                         fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET);
  422.                         fread(buffer1,64,1,fc);
  423.                         buffer1[openfile.file[i].write.dnum%64]=dd;
  424.                         fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET);
  425.                         fwrite(buffer1,64,1,fc);
  426.                         openfile.file[i].write.dnum=dd;
  427.                         openfile.file[i].write.bnum=0;
  428.                 }/*if*/
  429.                 t++;
  430.         }/*while*/
  431.         fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET);
  432.         fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/
  433.        
  434.     if((d=search(name,4,&dn,&bn))==false)/*找到目录路径,返回该目录所在块号dn和项数bn*/
  435.         {
  436.                 printf("Tis dir isn't exist,can't creat!\n\n");
  437.                 return(false);
  438.         }
  439.        
  440.         fseek(fc,dn*64L,SEEK_SET);
  441.         fread(buffer2,64L,1,fc); /*读出dnum盘块的内容*/
  442.        
  443.         buffer2[bn].length=length;
  444.         fseek(fc,dn*64L,SEEK_SET);
  445.         fwrite(buffer2,64L,1,fc);
  446.         printf("Content write successfully!\n\n");
  447.            return 1;
  448. }/*写函数结束*/



  449. /*删除文件*/
  450. int delete_file(char name[])
  451. {
  452.         int dnum,bnum,t;
  453.         if((t=search(name,4,&dnum,&bnum))==false)
  454.         {
  455.                 printf("File isn't exist,failed!\n\n");
  456.                 return(false);
  457.         }
  458.         if(sopen(name)!=-1)
  459.         {
  460.                 printf("Please close it first,can't delete!\n\n");
  461.                 return(false);
  462.         }
  463.         fseek(fc,dnum*64L, SEEK_SET);
  464.         fread(buffer2,64,1,fc);
  465.         buffer2[bnum].name[0]='
  466. ;/*将该文件的目录置成空目录*/
  467.         fseek(fc,dnum*64L, SEEK_SET);
  468.         fwrite(buffer2,64,1,fc);
  469.         while(t!='\xff')/*通过FAT查找每一个盘块号,并依次删除*/
  470.         {
  471.                 dnum=t;
  472.                 fseek(fc, dnum/64*64, SEEK_SET);
  473.                 fread(buffer1,64,1,fc);
  474.                 t=buffer1[dnum%64];
  475.                 buffer1[dnum%64]=0;
  476.                 fseek(fc, dnum/64*64L, SEEK_SET);
  477.                 fwrite(buffer1,64,1,fc);
  478.         }
  479.         printf("File deleted successfuly!\n\n");
  480.         return 1;
  481. }/*文件删除结束*/


  482. /*建立目录函数,目录路径名name*/
  483. int md(char name[])
  484. {
  485.         int i,j,k,s,d,t,b,dd,dn,bn;
  486.         char dname[3],pathname[20];
  487.         i=2;/* i=根目录的起始盘块号*/
  488.         /* 将name分成两部分,目录路径pathname和目录名dname*/
  489.         for(j=0;name[j]!='\0';j++)/*查找最后一个“/”*/
  490.                 if(name[j]=='/')s=j;
  491.                 /*分离目录路径*/
  492.                 for(j=0;j<s;j++)
  493.                         pathname[j]=name[j];
  494.                 pathname[j]='\0';
  495.                 /*分离目录名*/
  496.                 for(k=0,j=s+1;name[j]!='\0'&&k<3&&name[j]!='.';j++,k++)
  497.                         dname[k]=name[j];
  498.                 if(k==0)
  499.                 {
  500.                         printf("Wrong file name or dir!\n\n");
  501.                         return(false);
  502.                 }
  503.                 for(;k<3;k++)
  504.                         dname[k]=' ';
  505.                 if((d=search(pathname,8,&dn,&bn))==false)/*找到目录路径*/
  506.                 {
  507.                         printf("Dir isn't exist,creat failed!\n\n");
  508.                         return(false);
  509.                 }
  510.                 b=-1;
  511.                 /*确认该目录不存在的同时查找空目录项*/
  512.                 fseek(fc,d*64L,SEEK_SET);
  513.                 fread(buffer2,64L,1,fc);/*读出d盘块的内容*/
  514.                 for(t=0;t<8;t++)
  515.                 {
  516.                         if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]
  517.                                 &&buffer2[t].name[2]==dname[2]&&buffer2[t].attribute==8)
  518.                         {/*找到名字dname的目录,建立失败*/
  519.                                 printf("Already exist,can't creat!\n\n");
  520.                                 return(false);
  521.                         }
  522.                         if(buffer2[t].name[0]=='
  523. &&b==-1)
  524.                                 b=t;
  525.                 }/*for*/
  526.                 if(b==-1)/*没有空目录项, 不能建立*/
  527.                 {
  528.                         printf("Dir item full!\n\n");
  529.                         return(false);
  530.                 }
  531.                 if((dd=allocate( ))==false)/*分配给建立目录的磁盘盘块dd*/
  532.                 {
  533.                         printf("Dir can't creat!\n\n");
  534.                         return(false);
  535.                 }
  536.                 /*填写目录项*/
  537.                 for(i=0;i<3;i++)
  538.                         buffer2[b].name[i]=dname[i];
  539.                 buffer2[b].type[0]='d';
  540.                 buffer2[b].type[1]='i';
  541.                 buffer2[b].type[2]='r';
  542.                 buffer2[b].attribute=8;
  543.                 buffer2[b].address=dd;
  544.                 buffer2[b].length=0;
  545.                 fseek(fc,d*64L,SEEK_SET);
  546.                 fwrite(buffer2,64L,1,fc);
  547.                 /*分给新建目录的盘块初始化*/
  548.                 for(t=0;t<8;t++)
  549.                         buffer2[t].name[0]='
  550. ;
  551.                 fseek(fc, dd*64L, SEEK_SET);
  552.                 fwrite(buffer2,64L,1,fc);
  553.         printf("Dir created successfully!\n\n");
  554.                 return 1;
  555. }
  556. /*建立目录结束*/


  557. /*删除目录函数,目录路径名name*/
  558. int rd(char name[])
  559. {
  560.         int i,j,k,s,d,t,b,dn,bn;
  561.         char dname[3],pathname[20];
  562.         i=2;/* i=根目录的起始盘块号*/
  563.         /* 将name分成两部分,目录路径pathname和目录名dname*/
  564.         for(j=0;name[j]!='\0';j++)/*查找最后一个“/”*/
  565.                 if(name[j]=='/')s=j;
  566.                 /*分离目录路径*/
  567.                 for(j=0;j<s;j++)
  568.                         pathname[j]=name[j];
  569.                 pathname[j]='\0';
  570.                 /*分离目录名*/
  571.                 for(k=0,j=s+1;name[j]!='\0'&&k<3&&name[j]!='.';j++,k++)
  572.                         dname[k]=name[j];
  573.                 if(k==0)
  574.                 {
  575.                         printf("Wrong dir name!\n\n");
  576.                         return(false);
  577.                 }
  578.                 for(;k<3;k++)
  579.                         dname[k]=' ';
  580.                 if((d=search(pathname,8,&dn,&bn))==false)/*找到目录路径*/
  581.                 {
  582.                         printf("Aleady exist,can't creat!\n");
  583.                         return(false);
  584.                 }
  585.                 b=-1;
  586.                 /*确认该目录不存在的同时查找空目录项*/
  587.                 fseek(fc,d*64L,SEEK_SET);
  588.                 fread(buffer2,64L,1,fc);/*读出d盘块的内容*/
  589.                 for(t=0;t<8;t++)
  590.                 {
  591.                         if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]
  592.                                 &&buffer2[t].name[2]==dname[2]&&buffer2[t].attribute==8)
  593.                         {
  594.                                 b=t;
  595.                         }
  596.                 }
  597.                 /*填写目录项*/
  598.                
  599.                 buffer2[b].name[0]='
  600. ;
  601.                 fseek(fc,d*64L,SEEK_SET);
  602.                 fwrite(buffer2,64L,1,fc);
  603.                 printf("Dir deleted successfully!\n\n");
  604.                 return 1;
  605. }
  606. /*删除目录结束*/



  607. /*显示目录内容*/
  608. int dir(char name[])
  609. {
  610.         int dnum,t,dn,bn;
  611.         if((dnum=search(name,8,&dn,&bn))==false)/*找到目录路径,返回该目录所在块号dn和盘块内项数bn*/
  612.         {
  613.                 printf("Dir isn't exist!\n\n");
  614.                 return(false);
  615.         }
  616.         printf("Name  Type  Disk   Length\n");
  617.         /*显示目录内容*/
  618.         fseek(fc,dnum*64L,SEEK_SET);
  619.         fread(buffer2,64L,1,fc);
  620.         for(t=0;t<8;t++)/*显示该盘块中目录项的内容*/
  621.                 if(buffer2[t].name[0]!='
  622. )
  623.                         printf("%c%c%c   %c%c%c  %4d  %7d\n", buffer2[t].name[0],
  624.                         buffer2[t].name[1],
  625.                         buffer2[t].name[2], buffer2[t].type[0],
  626.                         buffer2[t].type[1],buffer2[t].type[2], buffer2[t].address,
  627.                         buffer2[t].length);
  628.         printf("\n");
  629.         return 1;
  630. }
  631. /*显示目录函数结束*/

  632. /*显示文件内容*/
  633. int typefile(char name[])
  634. {
  635.         int dnum,dn,bn,t;
  636.         if((dnum=search(name,1,&dn,&bn))==false)
  637.         {
  638.                 printf("File is exist!\n\n");
  639.                 return(false);
  640.         }
  641.         if(sopen(name)!=-1)
  642.         {
  643.                 printf("File is open,please close it first!\n\n");
  644.                 return(false);
  645.         }
  646.         while(dnum!='\xff')
  647.         {
  648.                 fseek(fc,dnum*64L,SEEK_SET);
  649.                 fread(buffer1,64,1,fc);/*读一个盘块到缓冲*/
  650.                 for(t=0;t<64&&buffer1[t]!='#';t++)/*显示缓冲中内容*/
  651.                         putchar(buffer1[t]);
  652.                 printf("\n");
  653.                 /*获得下一个盘块*/
  654.                 fseek(fc, dnum/64*64L, SEEK_SET);
  655.                 fread(buffer1,64,1,fc);
  656.                 dnum=buffer1[dnum%64];
  657.         }
  658.         printf("\n");
  659.         return 1;
  660. }
  661. /*显示文件函数结束*/


  662. int change(char name[],int attribute)
  663. /*改变文件name的属性为attribute*/
  664. {
  665.         int dnum,bnum;
  666.         if(search(name,1,&dnum,&bnum)==false)/*查找文件目录*/
  667.         {
  668.                 printf("File isn't exist!\n\n");
  669.                 return(false);
  670.         }
  671.         if(sopen(name)!=-1)
  672.         {
  673.                 printf("Please close it first,change failed!\n\n");
  674.                 return(false);
  675.         }
  676.         fseek(fc,dnum*64L,SEEK_SET);
  677.         fread(buffer2,64,1,fc);/*读出该目录所在盘块*/
  678.         buffer2[bnum].attribute=attribute;/*修改属性*/
  679.         fseek(fc,dnum*64L,SEEK_SET);
  680.         fwrite(buffer2,64,1,fc);/*写回磁盘*/
  681.         printf("File changed successfully!\n\n");
  682.     return 1;
  683. }/*改变文件属性函数结束*/

  684. void clear_fs()
  685. {
  686.         /*建立文件,模拟磁盘*/
  687.         /*初始化已打开文件表*/
  688.         /*初始化磁盘*/
  689.         /*初始化文件分配表*/
  690.         int i;
  691.         if((fc=fopen("c:\\c.txt","w+"))==NULL)
  692.                 {
  693.                         printf("Can't open file!\n\n");
  694.                         exit(0);
  695.                 }
  696.                 buffer1[0]=buffer1[1]=buffer1[2]=255;/*磁盘第0、1块存放FAT表,第2块存放根目录*/
  697.                 for(i=3;i<64;i++)
  698.                         buffer1[i]=0;
  699.                 fwrite(buffer1,64L,1,fc);
  700.                
  701.                 for(i=0;i<64;i++)
  702.                         buffer1[i]=0;
  703.                 fwrite(buffer1,64L,1,fc);
  704.                 /*初始化根目录*/
  705.                 for(i=0;i<8;i++)
  706.                         buffer2[i].name[0]='
  707. ;/*若目录项的第一个字符为“$”表示该目录项为空*/
  708.                 fwrite(buffer2,64L,1,fc);
  709.                 /*初始化已打开文件表*/
  710. }


  711. void show_menu()
  712. {
  713.         printf("             File System             \n");
  714.                 printf("*************************************");
  715.                 printf("\n");
  716.                 printf("*          1 - Creat File           *");
  717.                 printf("\n");
  718.                 printf("*          2 - Open File            *");
  719.                 printf("\n");
  720.                 printf("*          3 - Read File            *");
  721.                 printf("\n");
  722.                 printf("*          4 - Write File           *");
  723.                 printf("\n");
  724.                 printf("*          5 - Close File           *");
  725.                 printf("\n");
  726.                 printf("*          6 - Delete File          *");
  727.                 printf("\n");
  728.                 printf("*          7 - Creat Dir            *");
  729.                 printf("\n");
  730.                 printf("*          8 - Delete Dir           *");
  731.                 printf("\n");
  732.                 printf("*          9 - Show Dir Content     *");
  733.                 printf("\n");
  734.                 printf("*         10 - Show File Content    *");
  735.                 printf("\n");
  736.                 printf("*         11 - Change File Type     *");
  737.                 printf("\n");
  738.                 printf("*         12 - Clear File System    *");
  739.                 printf("\n");
  740.                 printf("*         13 - Exit                 *");
  741.                 printf("\n");
  742.                 printf("*************************************\n");
  743.                 printf("A kind remind: file name or type ,dir name is no more than three words!\n");
  744. }



  745. int main( )
  746. {
  747.         char name[20];
  748.         int attribute,type,length,i,a,s;
  749.         char buffer[64];
  750.         if((fc=fopen("c:\\c.txt","r+"))==NULL)
  751.         {
  752.                 clear_fs();
  753.         }
  754.         show_menu();
  755.     while(1)
  756.         {
  757.                 printf("Choose Menu(1~13) \nChoose 0 is to show menu:");
  758.                 scanf("%d",&a);
  759.                 switch(a)
  760.                 {
  761.                 case 0: /*a=0程序结束*/
  762.                         show_menu();
  763.                         break;
  764.                 case 1: /*a=1建立文件*/
  765.                         printf("Please input the direction & file name \n(like /a.txt) :");
  766.                         scanf("%s",name);
  767.                         create_file(name); /*建立文件*/
  768.                         break;
  769.                 case 2: /*a=2打开文件*/
  770.                         printf("Please input file name & type of open (0-Read,1-Write)\n(like /a.txt 1) :");
  771.                         scanf("%s%d",name,&type);
  772.                         open_file(name,type); /*打开文件*/
  773.                         break;
  774.                 case 3: /*a=3读文件*/
  775.                         printf("Please input file name\n(like /a.txt) :");
  776.                         scanf("%s",name);
  777.                         read_file(name); /*读文件*/
  778.                         break;
  779.                 case 4: /*a=4写文件*/
  780.                         printf("Please input file dir & file name \n(like /a.txt) :");
  781.                         scanf("%s",name);
  782.                         printf("Please input the content you want to add :\n");
  783.                         scanf("%s",buffer);
  784.                         s=strlen(buffer);
  785.                         write_file(name,buffer,s); /*写文件*/
  786.                         break;
  787.                 case 5: /*a=5关闭文件*/
  788.                         printf("Please input file dir & file name \n(like /a.txt) :");
  789.                         scanf("%s",name);
  790.                         close_file(name); /*关闭文件*/
  791.                         break;
  792.                 case 6: /*a=6删除文件*/
  793.                         printf("Please input file dir & file name \n(like /a.txt) :");
  794.                         scanf("%s",name);
  795.                         delete_file(name); /*删除文件*/
  796.                         break;
  797.                 case 7: /*a=7建立目录*/
  798.                         printf("Please input dir \n(like /abc) :");
  799.                         scanf("%s",name);
  800.                         md(name); /*建立目录*/
  801.                         break;
  802.                 case 8: /*a=8删除目录*/
  803.                         printf("Please input dir \n(like /abc) :");
  804.                         scanf("%s",name);
  805.                         rd(name); /*显示目录*/
  806.                         break;
  807.                 case 9: /*a=9显示目录*/
  808.                         printf("Please input dir \n(like /abc) :");
  809.                         scanf("%s",name);
  810.                         dir(name); /*显示目录*/
  811.                         break;
  812.                 case 10: /*a=10显示文件*/
  813.                         printf("Please input file dir & file name \n(like /a.txt) :");
  814.                         scanf("%s",name);
  815.                         typefile(name); /*显示文件*/
  816.                         break;
  817.                 case 11:/* a=11改变文件属性 */
  818.                         printf("Please input file name & type of file(1-Read only,4-Read & write)\n(like /a.txt 1) :");
  819.                         scanf("%s%d",name,&attribute);
  820.                         change(name,attribute);
  821.                         break;
  822.         case 12:/* a=12 格式化 */
  823.                         clear_fs();
  824.                         printf("Clear file system successfully! \n\n");       
  825.                         break;
  826.                 case 13: /*a=0程序结束*/
  827.                         fclose(fc);
  828.                         printf("Thank you for using my file system program!\nPress any key to quit.");
  829.             getchar();getchar();
  830.                         exit(0);
  831.                 }/* switch */
  832.         }/* while */
  833.         return 1;
  834. }/*main( )结束*/
复制代码
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:文件操作例程,纯C++ 编写.rar 
文件大小:13.31 KB  售价:1金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索