请将参考程序中的copyf( )函数用copyf1( )函数替代,来处理copy命令。要求新的复制文件函数copyf1( ),可以使复制得到的目标文件显示内容(块号)与源文件相同。copyf1( )采用的方法是将源文件的目录项复制到目标文件的目录项,再将新目录项中的文件名改为目标文件名。这样的复制过程虽然不符合操作系统复制文件的实际情况(操作系统复制文件时要为目标文件分配磁盘空间),但它可以使在本模拟系统中达到目标文件与源文件显示内容(块号)相同的效果。从操作系统看,这实际上是两个文件名共享同一个文件。这种情况下,删除两个文件之一时,不能回收文件的磁盘空间,否则余下文件的首块号指针将悬空。因此,delete命令的处理函数必须作相应修改,修改后的删除文件处理函数是deletef1()。函数deletef1()执行删除操作时,应判断文件夹中有没有与要删除文件首块号相同的文件,若有则仅删除该文件对应的目录项,而不回收其占用的磁盘块;若无则按正常情况执行,即既删除目录项又回收磁盘空间。
int copyf(int uid,int k) //copy()命令的处理函数:复制文件
{ //复制文件时,为目标文件分配新的盘块,这符合计算机系统复制文件的实际情况,
//但因本程序中显示文件内容采用显示盘块号的方式模拟,故用type命令显示目标
//文件内容时,显示内容与源文件不同。而实际系统中显示的是盘块中的内容,故
//实际系统中源文件和目标文件的显示内容是相同的。
int i,i_ufd,i_uof,j,m,n;
if(k<2)
{
cout<<"命令中参数太少。\n";
return -1;
}
i_ufd=check_UFD(uid); //查找用户UFD
if (i_ufd==L)
{
cout<<"源文件"< return -2;
}
i_uof=check_UOF(uid); //查UOF
if (i_uof {
cout<<"源文件正在使用,不能复制。\n";
return -2;
}
for (m=0;m {
j=ufd[uid][m].rccount;
if (j>=0 && strcmp(comd[2],ufd[uid][m].fn)==0)
break;
}
if (m {
cout<<"目标文件已有同名文件,不能复制。\n";
return -4;
}
for (i=0;i if (ufd[uid][i].rccount==-1) break;
if (i==L)
{
cout<<"已无空目录登记栏,不能复制新文件。\n";
return -3;
}
m=ufd[uid][i_ufd].rccount; //记下源文件的记录数
if (FAT[0] {
cout<<"磁盘空间已不足,不能复制文件\n";
return -5;
}
strcpy(ufd[uid][i].fn,comd[2]); //新目录项中存目标文件名
ufd[uid][i].fattrib=ufd[uid][i_ufd].fattrib;//复制文件属性
ufd[uid][i].rccount=m; //复制文件记录数
j=getblock(); //取一空闲盘块
ufd[uid][i].faddr=j; //新文件的首块号
for (i=1;i {
n=j; //记下前一空闲块号
j=getblock(); //取一新空闲盘块
FAT[n]=j; //构成链接
}
FAT[j]=-1; //链表尾结点
cout<<"\n文件复制成功。\n";
return 0;
}
int copyf1(int uid,int k) //copy()命令的处理函数:复制文件
{ //因本模拟程序显示文件内容采用显示块号模拟,为使目标文件显示内容
//与源文件相同,故本函数采用将源文件的目录项复制到目标文件的目录
//项,只是将新目录项中的文件名改为目标文件名。这样的复制过程实际
//上不符合操作系统复制文件的情况,但它可以使在本模拟系统中实现目
//标文件与源文件显示内容相同的效果。从操作系统看,这实际上是两个
//文件名共享同一个文件。这种情况下,删除两个文件之一时,不能回收
//文件的磁盘空间,否则余下文件的首块号指针将悬空。因此,与copyf1
//函数对应的delete命令的函数deletef1()执行删除操作时,应判断文件
//夹中有没有与要删除文件首块号相同的文件,若有则仅删除该文件对应
//的目录项,而不回收其占用的磁盘块;若无则按正常情况执行,即既删
//除目录项又回收磁盘空间。
//
//
// 请完成本函数的设计、调试,并画出详细流程图。
//
//
cout<<"文件复制成功。\n";
return 0;
}
--------------------next---------------------
阅读(1154) | 评论(0) | 转发(0) |