操作系统文件操作详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "iostream.h"
#include "string"
#include "stdio.h"
struct fname //文件目录项结构体
{
char Wname[7]; //文件名
char Form[5]; //格式
int i; //文件所占用磁盘块的第一个磁盘块号
int Number; //文件所占用磁盘块的块数
long int size; //文件大小
}file[11];
int num;
struct empty //盘块结构体
{ int map[11]; //盘块位示图
int filenum; //文件数量
}emptytable; //模块说明:
void mnue() //菜单函数
{
printf(" *************************** 欢迎访问文件管理系统 ********************\n");
printf("\t1. 显示目录 \t2. 创建文件 \n \n");
printf("\t3. 显示文件 \t4. 复制文件 \n\n");
printf("\t5. 删除文件 \t6. 文件初始化 \n\n");
printf("\t7. 退出程序 \n\n");
printf(" ***********************************************************************\n");
printf(" 请选择你所要进行的操作:");
}
void main()
{ char k;
while(1)
{ mnue(); //显示系统菜单
void dir();
void mkfile();
void type();
void copy();
void delfile();
void SystemInit();
k=getchar();getchar();
switch (k)
{
case '1': dir();
break;
case '2': mkfile();
break;
case '3': type();
break;
case '4': copy();
break;
case '5': delfile();
break;
case '6': SystemInit();
break;
case '7': exit(1);
default : printf("error\n");
exit(0);
}
}
}
void SystemInit() //模拟磁盘文件初始化函数
{ char ch;
int y,n;
for(int i=2;i<10;i++)
{
emptytable.map[i]=0; //初始化存放位示图的盘块
emptytable.map[0]=1;
emptytable.map[1]=1;
emptytable.filenum=0;
}
printf("系统初始化将删除已有的所有程序是否继续(y/n)");
ch=getchar();
if(ch=='Y'||ch=='y')
{
FILE *fp;
if((fp=fopen("gaoxiang.txt","wb+"))==NULL) //wb+:为读写建立一个"新"文件;打开系统文件将文件目录盘块和
{ //位示图盘块写入系统文件
printf("can not open file \n");
exit(0);
}
fseek(fp,512L,0);
fwrite(&emptytable,sizeof(struct empty),1,fp);
fclose(fp);
printf("初始化系统成功!!!\n");
}
if(ch=='N'||ch=='n')
printf("系统初始化失败");
}
void WriteFile() //将目录以及空闲盘块表写入磁盘
{
FILE *fp;
if((fp=fopen("gaoxia
ng.txt","rb+"))==NULL)
{
printf("can not open file \n");
exit(0);
}
rewind(fp);
for(int i=0;i
fwrite(&file[i],sizeof(struct fname),1,fp); //文件目录
}
fseek(fp,512L,0);
fwrite(&emptytable,sizeof(struct empty),1,fp); //位示图
fclose(fp);
}
void dir() //显示文件目录
{ int i,j;
FILE *fp;
if((fp=fopen("gaoxiang.txt","rb"))==NULL)
{ printf("can not open file \n");
exit(0);
}
fseek(fp,512L,0); //空闲盘块表的定位
fread(&emptytable,sizeof(struct empty),1,fp);
rewind(fp); //文件目录表的定位
num=emptytable.filenum;
for(i=0;i
if (num!=0)
{ printf("文件的目录如下:\n");
for(i=0,j=1;i
printf("%s.%s\n",file[i].Wname,file[i].Form);
if(j==5)
{
j=1;
}
}
}
printf("共有文件%d个\n ",num);
fclose(fp);
}
void type() //显示文件内容
{
FILE *fp;
int i,j;
if((fp=fopen("gaoxiang.txt","rb"))==NULL)
{ printf("can not open file \n");
exit(0);
}
fseek(fp,512L,0);
fread(&emptytable,sizeof(struct empty),1,fp);
rewind(fp);
num=emptytable.filenum;
for(i=0;i
printf("%s.%s\n",file[i].Wname,file[i].Form);
}
char Wname[9],ext1[4];
printf("请输入文件名:");
gets(Wname); //scanf("%s",Wname);//getchar();
if(*(Wname+0)=='\0')
{
printf("文件名不能为空 ! \n");
return;
}
int sign=0;
for(i=0;i
{ printf("\t查找了%d个文件\t",i+1);
sign=1;
break;
}
if(sign==0)
{ printf("无此文件\n");
return;
}
//显示文件
int b,m,n ;
b=file[i].i;
n=file[i].size;
printf("\t该文件位于第%d块\n",b-1);
printf("\t从文件读出的文件长度为:%d\n",n);
//fseek(fp,b*512L,0);
char cc;
//printf("---文件内容长度为:%ld\n",n);
printf("\t文件内容为:");
for( m=0,j=1; m
fseek(fp,b*512L+m,0);
//fread(&cc,sizeof(char),1,fp);
cc=fgetc(fp);
printf("%c",cc);
if(j%80==0)printf("\n");
}
printf("\n");
fclose(fp);
}
void delfile() //删除一个文件
{ FILE *fp;
int i;
if((fp=fopen("gaoxiang.txt","r"))==NULL)
{
printf("can not open file \n");
exit(0);
}
fseek(fp,512L,0);
fread(&emptytable,sizeof(struct empty),1,fp);
rewind(fp);
num=emptytable.filenum;
for(i=0;i
char Wname[9],ext1[3];
printf("请输入文件名:");
gets(Wname);
//scanf("%s",Wname);getchar();
printf("请输入格式:");
gets(ext1);
//scanf("%s",ext1);getchar();
if(*Wname=='\0')
{ printf("文件名不能为空 ! \n"); return; }
if(*ext1=='\0') strcpy(ext1,"txt");
char judge;
printf("是否删除文件%s.%s [y/n]",Wname,ext1);
scanf("%c",&judge); getchar();
if((judge=='y')||(judge=='Y'))
printf("准备删除文件%s.%s !\n",Wname,ext1);
else if((judge=='n')||(judge=='N'))
return;
else
{
printf("系统默认放弃!\n");
return;
}
int sign=0;
for(i=0;i
{
sign=1;
break;
}
if(sign==0)
{ printf("文件名错\n");
return;
}
//回收空间
int b=file[i].i;
int Number=file[i].Number;
int j;
for(j=0;j
for( j=i;j
strcpy(file[j].Form,file[j+1].Form);
file[j].i=file[j+1].i;
file[j].size=file[j+1].size;
file[j].Number=file[j+1].Number;
}
emptytable.filenum=emptytable.filenum-1;
num=emptytable.filenum;
WriteFile();
fclose(fp);
}
void copy() //复制一个文件
{ FILE *fq;
int i,j;
if((fq=fopen("gaoxiang.txt","rb+"))==NULL)
{ printf("can not open file \n");
exit(0);
}
fseek(fq,512l,0);
fread(&emptytable,sizeof(struct empty),1,fq);
rewind(fq);
num=emptytable.filenum;
for(i=0;i
char SourceName[9],DestName[9],ext1[4],ext2[4];
printf("请输入源文件名:");
gets(SourceName); //scanf("%s",SourceName);getchar();
printf("请输入源文件格式:");
gets(ext1); //scanf("%s",ext1);getchar();
printf("请输入目标文件名:");
gets(DestName); //scanf("%s",DestName);getchar();
printf("请输入目标扩展文件名");
gets(ext2); //scanf("%s",ext2);getchar();
if(*ext2=='\0') strcmp(ext2,"txt");
if((*SourceName)=='\0' || (*DestName)=='\0')
{
cout<<"错误! 文件名不能为空!\n";
return;
}
if(strcmp(SourceName,DestName)==0)
{
cout<<"错误! 两个文件名不能相等!\n";
return;
}
for(i=0;i
{
strcpy(file[num].Wname,DestName);
strcpy(file[num].Form,ext2);
//file[num].i=file[i].i;
file[num].size=file[i].size;
file[num].Number=file[i].Number;
break;
}
if (i
else
{
printf("不存在源文件\n");
return;
}
//空间分配
int sign=0;
for(int m=2 ; m<=10-file[num].Number ; m++)
{
if
(emptytable.map[m]==0)
{
for( j=file[i].Number; j>0; j--)//寻找一连续的空闲盘块
if(emptytable.map[m+j-1]==1)
{
sign=1;
break;
}
if(sign==0) break;
m+=j-1;
sign=0;
}
}
if (m <= 10-file[num].Number)
{ for(j=0;j < file[num].Number;j++)
emptytable.map[m+j]=1;
file[num].i=m;
}
else
printf("没有足够的连续的盘块数\n");
//写数据
FILE *fq1;
rewind(fq);
fq1=fq;
fseek(fq,(file[i].i) * 512L,0);
printf("\n文件的起始盘块号:%d",file[i].i-1);
//rewind(fp1);
fseek(fq1,(file[num].i) * 512L,0);
printf("\n复制文件%的起始盘块号:%d",file[num].i-1);
char cc;
printf("\n源文件内容为:");
for(int k=0 ; k
fseek(fq,(file[i].i) * 512L+k,0);
fread(&cc,sizeof(char),1,fq);
printf("%c",cc);
fseek(fq1,(file[num].i) * 512L+k,0);
fwrite(&cc,sizeof(char),1,fq1);
}
printf("\n");
num=num+1;
emptytable.filenum=num;
WriteFile();//写目录及位示图
fclose(fq);
fclose(fq1);
}
void mkfile()//建立一个文件
{ struct strNode//数据块
{ char word[64];
struct strNode *next;
}*head,*p,*q;
char Wname[9],ext1[4];
int i=0,j=0;
head=p=q=new struct strNode; //申请结构体内存空间
char ch;
printf("请输入文件内容,按 0 键保存且退出!\n");
do{
for(i=0;i<64;i++)
{
//ch=getchar();
scanf("%c",&ch);
p->word[i]=ch;
if(ch=='0')break;
}
if(ch!='0')
{
p=new struct strNode;
q->next=p;
q=p;
j++;
}
}while(ch!='0');
getchar();
int num1, size=(j*64+i)*sizeof(char);
////////
printf("文件长度为:%d\n",size);
char judge='n';
do{
printf("请输入文件名:");
gets(Wname);
//scanf("%s",Wname);getchar();
printf("请输入文件格式:");
gets(ext1);
//scanf("%s",ext1);getchar();
if(*ext1=='\0')strcpy(ext1,"txt");
judge='y';
if(*Wname=='\0')
{
printf("错误!文件名不能为空!\n");
printf("是否放弃此文件[Y/N] ");
scanf("%c",&judge);getchar();
if( (judge=='y') || (judge=='Y') )
return;
}
}while( (judge=='n') || (judge=='N') );
FILE *fp;
if((fp=fopen("gaoxiang.txt","r+"))==NULL)
{ printf("can not open file");
exit(0);
}
fseek(fp,512l,0);
fread(&emptytable,sizeof(struct empty),1,fp);
rewind(fp);
num=emptytable.filenum;
for(i=0;i
fread(&file[i],sizeof(struct fname),1,fp);
printf("%s.%s\n",file[i].Wname,file[i].Form);
}
for (i=0;i
if( (strcmp(file[i].Wname,Wname)==0))
{
printf("! 错误 ! 两个文件名不能相等\n");
return;
}
}
num1=size/512;
if((size%512)>0) num1=num1+1;
strcpy(file[num].Wname,Wname);
strcpy(file[num].Form,ext1);
file[num
].size = size;
file[num].Number=num1;
int sign=0 ,n=0;
//空间分配
for(int m=2 ; m <=10-num1; m++)
{ if(emptytable.map[m]==0)
{
for(n=file[num].Number; n>0; n--)
if(emptytable.map[m+n-1]==1)
{ sign=1;
break;
}
if(sign==0)break;
m+=n-1;
sign=0;
}
}
if(m<=10-num1)
file[num].i = m;
else
{ printf("空间不足!\n");
return;
}
for(j=0;j < file[num].Number;j++)
emptytable.map[m+j]=1;
num=num+1;
emptytable.filenum=num;
WriteFile();//写目录及位示图
//写数据
fseek(fp,file[num-1].i * 512L,0);
long int cycle=file[num-1].size;
p=head; i=0;
for(j=cycle;j>0;j--)
{ ch=p->word[i++];
fwrite(&ch,sizeof(char),1,fp);
if(i>=64)
{ i=0;
p=p->next;
}
// cycle--;
}
fclose(fp);
}