int my_mkdir(char *dirname)
{
int i,j;
struct FCB *cur_mkdir = root;
char dir ;
for(j = fd ; j >= 0 ; j--)
if(openfilelist[j].attribute == 0)
break;
dir = openfilelist[j].nextdirectory;
if( strlen(dirname) > 10)
return -1;
//if(lengthdir == 32)
// return -2; //full
for(i = 0 ; i < MAXOPENFILE ; i++)
{
if(openfilelist[i].topenfile == -1)
break;
}
if(i == MAXOPENFILE)
return -3;
if(dir == -1)
{
for(i = 0 ; i < MAXFCB ; i++)
{
if(cur_mkdir[i].attribute == -1)
break;
}
if(i == MAXFCB)
return -2;
/*-------------填写目录项----------*/
strcpy(cur_mkdir[i].filename,dirname);
cur_mkdir[i].attribute = 0;
cur_mkdir[i].data = 0;
cur_mkdir[i].time = 12;
cur_mkdir[i].nextdirectory = -1;
cur_mkdir[i].nextfile = -1;
cur_mkdir[i].length = 0;
cur_mkdir[openfilelist[fd].topenfile].nextdirectory = i;
openfilelist[fd].nextdirectory = i;
openfilelist[fd].fcbstate = 1;
}
else
{
while(cur_mkdir[dir].nextfile != -1)
{
if(!strcmp(cur_mkdir[dir].filename,dirname))
return -4;
dir = cur_mkdir[dir].nextfile;
}
if(!strcmp(cur_mkdir[dir].filename,dirname))
return -4;
for(i = 0 ; i < MAXFCB ; i++)
{
if(cur_mkdir[i].attribute == -1)
break;
}
if(i == MAXFCB)
return -2;
/*-------------填写目录项----------*/
strcpy(cur_mkdir[i].filename,dirname);
cur_mkdir[i].attribute = 0;
cur_mkdir[i].data = 0;
cur_mkdir[i].time = 12;
cur_mkdir[i].nextdirectory = -1;
cur_mkdir[i].nextfile = -1;
cur_mkdir[i].length = 0;
cur_mkdir[dir].nextfile = i;
openfilelist[fd].fcbstate = 1;
}
lengthdir++;
return 1;
}
int my_rmdir(char *dirname)
{
int j;
struct FCB *cur_mkdir = root;
char dir;
for(j = fd ; j >= 0 ; j--)
if(openfilelist[j].attribute == 0)
break;
dir = openfilelist[j].nextdirectory;
char frontdir = dir;
int flag = 0;
while(cur_mkdir[dir].nextfile != -1)
{
if(!strcmp(cur_mkdir[dir].filename,dirname))
{
flag = 1;
break;
}
frontdir = dir;
dir = cur_mkdir[dir].nextfile;
}
if(!strcmp(cur_mkdir[dir].filename,dirname))
flag = 1;
if(flag == 0) //not find
return -1;
if(frontdir == dir)
cur_mkdir[frontdir].nextdirectory = cur_mkdir[dir].nextfile;
else
cur_mkdir[frontdir].nextfile = cur_mkdir[dir].nextfile;
cur_mkdir[dir].attribute = -1;
if(cur_mkdir[dir].nextdirectory != -1) // file in the directory;
{
//delete brother nodes;
dir = cur_mkdir[cur_mkdir[dir].nextdirectory].nextfile;
while(dir != -1)
{
if(cur_mkdir[dir].attribute == 0)
my_rmdir(cur_mkdir[dir].filename);
else
my_rm(cur_mkdir[dir].filename);
dir = cur_mkdir[dir].nextfile;
}
if(cur_mkdir[dir].attribute == 0)
my_rmdir(cur_mkdir[dir].filename);
else
my_rm(cur_mkdir[dir].filename);
//delete this node;
if(cur_mkdir[cur_mkdir[dir].nextdirectory].attribute == 0)
my_rmdir(cur_mkdir[cur_mkdir[dir].nextdirectory].filename);
else
my_rm(cur_mkdir[cur_mkdir[dir].nextdirectory].filename);
}
lengthdir--;
//删除当前目录
return 1;
}
void my_ls(void)
{
int j;
struct FCB *cur_mkdir= root;
for(j = fd ; j >= 0 ; j--)
if(openfilelist[j].attribute == 0)
break;
char dir = openfilelist[j].nextdirectory;
if(dir == -1)
return ;
else
{
while(cur_mkdir[dir].nextfile != -1)
{
printf("%s\t\t",cur_mkdir[dir].filename);
if(cur_mkdir[dir].attribute == 1) /*-文件-*/
printf("%d\t\t\n",cur_mkdir[dir].length);
else /*-目录-*/
printf("%d\t\t<DIR>\t\n",cur_mkdir[dir].length);
dir = cur_mkdir[dir].nextfile;
}
printf("%s\t\t",cur_mkdir[dir].filename);
if(cur_mkdir[dir].attribute == 1) /*-文件-*/
printf("%d\t\t\n",cur_mkdir[dir].length);
else /*-目录-*/
printf("%d\t\t<DIR>\t\n",cur_mkdir[dir].length);
}
}