void del_file(char filename[]) //删除文件
{
int i,j,k;
for(i=0;i<640;i++)
{
if(strcmp(filename,root[i].file_name)==0)
{
k=root[i].i_num;
for(j=0;j<i_node[k].file_length;j++)
{
physic[j]=i_node[k].file_address[j];
}
callback(i_node[k].file_length); //调用 回收函数
for(j=0;j<100;j++) //删除文件后要将文件属性和目录项的各个值恢复初值
{
i_node[k].file_address[j]=-1; //地址恢复初值
}
strcpy(root[i].file_name,""); //文件名恢复初值
root[i].i_num=-1; //目录项的I结点信息恢复初值
strcpy(root[i].dir_name,""); //目录项的文件目录信息恢复初值
i_node[k].file_length=-1; //文件长度恢复
i_node[k].file_style=-1; //文件类型恢复初值
break;
}
}
if(i==640)
{
printf("不存在这个文件\n");
}
}
void del_dir(char filename[]) //删除目录 需要判断目录下时候为空,不为空就不删除
{
int i,j,k;
for(i=0;i<640;i++) //还要加条件判断要删除的目录是不是当前目录
{
k=root[i].i_num; //找到目录名字
if( strcmp(root[i].file_name,filename)==0 && strcmp(cur_dir,filename)!=0 && (i_node[k].file_style)==0 )
{
for(j=0;j<640;j++)
{
if(strcmp(filename,root[j].dir_name)==0)
{
printf("目录不为空不能直接删除\n");
break;
}
}
if(j==640)
{
del_file(filename);
break;
}
break;
}
}
if(i==640)
{
printf("这个不是目录文件 或者不存在这个目录,或者你要删除的是当前目录\n");
}
}
void display_curdir() //显示当前目录下的文件列表
{
int i,k;
printf("\t\t文件名字 文件类型 文件长度 所属目录\n");
for(i=0;i<640;i++)
{
if(strcmp(cur_dir,root[i].dir_name)==0) //查询文件中 所在目录信息和当前目录信息相同的数据
{
k=root[i].i_num;
printf("\t\t %s\t",root[i].file_name); //文件名
printf("\t%d\t",i_node[k].file_style); //文件的类型
printf("%d\t",i_node[k].file_length); //文件的长度
printf("%s\n",root[i].dir_name); //文件所在的目录
}
}
}
void display_dir(char filename[]) //进入指定的目录
{
int i,k;
for(i=0;i<640;i++)
{
k=root[i].i_num; //判断文件类型是不是目录类型
if((strcmp(filename,root[i].file_name)==0) && (i_node[k].file_style==0))
{
strcpy(cur_dir,filename); //将要进入的指定目录设置为当前目录 赋值不要反了strcpy(目的,源)
break;
}
}
if(i==640)
{
printf("没有这个目录\n");
}
}
void open_file(char filename[]) //打开文件
{
int i,j,k;
printf("\t\t文件名字 文件类型 文件长度 所属目录\n");
for(i=0;i<640;i++)
{
k=root[i].i_num;
if(strcmp(filename,root[i].file_name)==0 && (i_node[k].file_style==1))
{
printf("\t\t %s\t",root[i].file_name); //文件名
printf("\t%d\t",i_node[k].file_style); //文件的类型
printf("%d\t",i_node[k].file_length); //文件的长度
printf("%s\n",root[i].dir_name); //文件所在的目录
printf("\t\t文件占用的物理地址\n");
for(j=0;j<i_node[k].file_length;j++) //显示物理地址
{
printf("%d ",i_node[k].file_address[j]); //文件具体占用的盘块号
}
printf("\n");
break;
}
}
if(i==640)
{
printf("没有这个文件 或者这个文件不是正规文件\n");
}
}
void back_dir() //返回上一级目录
{
int i,k;
for(i=0;i<640;i++) //查询和当前目录名相同的目录文件名
{
k=root[i].i_num;
if(strcmp(cur_dir,root[i].file_name)==0 && (i_node[k].file_style==0))
{
strcpy(cur_dir,root[i].dir_name); //将查询到的目录文件名 所在的目录赋值给当前目录
}
}
}
void display_sys() //显示系统信息(磁盘使用情况)
{
int i,m,k=0;
for(i=0;i<20449;i++)
{
if(memory[i].a==0)
k++;
}
m=20449-k;
printf("空闲的盘块数是:\t");
printf("%d\n",k);
printf("使用的盘块数是:\t");
printf("%d\n",m);
}