📄 文件管理实验程序.c
字号:
if (!init_disk())
return 0;
fseek(disk, sector*SECTOR_SIZE, SEEK_SET);
return fwrite(buf, SECTOR_SIZE, 1, disk);
}
/*************************************************/
/* 所有与文件系统有关的初始化工作都在此完成 */
/* 成功返回非0值,否则返回0 */
/*************************************************/
int init_fs(void)
{
char m[MAX_FINENAME_LEN-6] = {0};
char putcontent[SECTOR_SIZE]; /*缓存文件列表所占一个扇区的内容*/
int i,j,k;
struct file *p;
p = head;
for(i=0;i<9;i++) /*将虚拟硬盘中文件列表读到缓冲区*/
{ /*namecontent[9*SECTOR_SIZE]中 */
read_disk(i,putcontent);
for(j=0;j<SECTOR_SIZE;j++)
namecontent[i*SECTOR_SIZE+j] = putcontent[j] ;
}
for(i=0;i<128;i++) /*缓冲区namecontent[9*SECTOR_SIZE]中 */
{ /*的每个文件名的信息读到文件列表中struct file*/
for(j=0;j<MAX_FINENAME_LEN-6;j++)
m[j] = namecontent[i*MAX_FINENAME_LEN+j];
if(m[0] == NULL && i !=0)break;
p->next = (struct file*)malloc(sizeof(struct file));
strcpy(p->next->filen,m);
p->next->num_sector = namecontent[i*MAX_FINENAME_LEN+14];
p->next->size = namecontent[i*MAX_FINENAME_LEN+15];
for(j=0;j<(p->next->num_sector);j++)
p->next->sector[j] = namecontent[i*MAX_FINENAME_LEN+16+j];
p = p->next;
}
p->next = NULL;
return !0;
}
/*************************************************/
/* 从文件filename的头部开始读size大小的内容到buf */
/* 如果文件实际内容不够size,就有多少读多少 */
/* 返回实际读入的字节数。如果出错,返回0 */
/*************************************************/
int my_read(const char* filename, void* buf, int size)
{
int len;
int i;
char content[SECTOR_SIZE]; /*缓存文件所占一个扇区的内容*/
struct file *p;
p = head;
rewind(disk);
while(p->next !=NULL)
{
p = p->next;
if(!strcmp(p->filen,filename))
{
for(i=0;i<(p->num_sector);i++)
{
read_disk(p->sector[i],content); /*读文件内容,并将所有扇区的*/
putstring(i,buf,content,SECTOR_SIZE); /*内容追加到buf中*/
}
if((p->size)>size)return 0;
return (p->size+(p->num_sector-1)*256);
}
}
return 0;
}
/*************************************************/
/* 把buf指向的size大小的内容写入到文件filename */
/* 如果文件不存在,就新建。存在,就覆盖 */
/* 成功返回非0值,否则返回0 */
/*************************************************/
int my_write(const char* filename, void* buf, int size)
{
int i,m,n=0,j,k;
int num;
int lastsize;
char content[SECTOR_SIZE]; /*缓存文件所占一个扇区的内容 */
char putcontent[SECTOR_SIZE]; /*缓存文件列表所占一个扇区的内容*/
struct file *p;
p = head;
num = (int)(size/256.0+0.9999999);
lastsize = size-SECTOR_SIZE*(num-1);
while(p->next != NULL)
{
n++;
if(!strcmp(p->next->filen,filename)) /*判断是否重名,是的话将原来的文*/
{ /*件名和内容删除*/
my_del(filename);
}
p = p->next;
};
p->next = (struct file*)malloc(sizeof(struct file));
strcpy(p->next->filen,filename);
for(i=0;i<MAX_FINENAME_LEN-6;i++)
namecontent[n*MAX_FINENAME_LEN+i] = filename[i];
p->next->size = lastsize;
p->next->num_sector = num;
namecontent[n*MAX_FINENAME_LEN+14] = num; /*记录文件最后扇区的大小*/
namecontent[n*MAX_FINENAME_LEN+15] = lastsize; /*记录文件所占的扇区个数*/
for(i=0;i<4;i++)
{
if(i<num)
{ /*记录文件所占的扇区的号*/
getstring(i,buf,content,SECTOR_SIZE);
m = isnull();
write_disk(m,content);
p->next->sector[i] = m;
namecontent[n*MAX_FINENAME_LEN+16+i] = m;
}
else
{
p->next->sector[i] = 0; /*没有占用扇区就将sector[i]=0*/
namecontent[n*MAX_FINENAME_LEN+16+i] = m;
}
}
p->next->next = NULL;
for(i=0;i<9;i++)
{
for(j=0;j<SECTOR_SIZE;j++)
{
putcontent[j] = namecontent[i*SECTOR_SIZE+j];
}
write_disk(i,putcontent); /*将文件名的信息写入虚拟硬盘*/
}
return !0;
}
/************************************************/
/* 把文件系统中文件名与filename相匹配的文件删除 */
/* 成功返回非0值,否则返回0 */
/************************************************/
int my_del(const char* filename)
{
struct file *p,*q,*w;
int n=-1,m = 0;
int i,j;
char dump[SECTOR_SIZE] = {0};
char my_filename[MAX_FINENAME_LEN];
char putcontent[SECTOR_SIZE]; /*缓存文件列表所占一个扇区的内容*/
p = head;
q = head;
while(p->next != NULL)
{
if(!strcmp(p->next->filen,filename))
{
for(i=0;i<(p->next->num_sector);i++)/*删除文件链表中的一个文件节点*/
{
write_disk(p->next->sector[i],dump);
}
w = p->next;
p->next = w->next;
free(w);
m = 1;
break;
}
p = p->next;
};
if(m) /*如果删除文件节点成功,修改文件缓冲区*/
{
for(i=0;i<9;i++)
write_disk(i,dump);
for(i=0;i<9*SECTOR_SIZE;i++)
namecontent[i] = 0;
while(q->next !=NULL)
{
n++;
strcpy(my_filename,q->next->filen);
for(i=0;i<MAX_FINENAME_LEN-6;i++)
namecontent[n*MAX_FINENAME_LEN+i] = my_filename[i];
namecontent[n*MAX_FINENAME_LEN+14] = q->next->num_sector;
namecontent[n*MAX_FINENAME_LEN+15] = q->next->size;
for(i=0;i<(q->next->num_sector);i++)
namecontent[n*MAX_FINENAME_LEN+16+i] = q->next->sector[i];
q = q->next;
}
for(i=0;i<9;i++)
{
for(j=0;j<SECTOR_SIZE;j++)
{
putcontent[j] = namecontent[i*SECTOR_SIZE+j];
}
write_disk(i,putcontent); /*将文件名的信息写入虚拟硬盘*/
}
return !0;
}
else
return 0;
}
/************************************************/
/* 显示文件系统中所有文件的信息 */
/************************************************/
int dir(void)
{
struct file *p;
p = head;
printf("\t--------------------------------------------\n");
printf("\tname\t*\tsectors \t*\tsize\n");
printf("\t--------------------------------------------\n");
while(p->next!=NULL)
{
p = p->next;
if(p == head->next)continue;
printf("\t%s\t->\t%d %d %d %d\t->\t%d\n",p->filen,p->sector[0],p->sector[1],p->sector[2],p->sector[3],p->size+((p->num_sector-1)*256));
}
printf("\t--------------------------------------------\n");
return !0;
}
/************************************************/
/*找出扇区为空,并且扇区好最小的扇区,返回扇区号*/
/************************************************/
int isnull(void)
{
int i;
char m[1];
fseek(disk,10*SECTOR_SIZE,0);
for(i=0;i<117;i++)
{
fread(m,1,1,disk);;
if(m[0]==NULL)return 10+i;
fseek(disk,(11+i)*SECTOR_SIZE,0);
}
return 0;
}
/*************************************************/
/*取字符串buf中从第num*size位开始的size个字符存放*/
/*到字符串content中 */
/*************************************************/
int getstring(int num,char* buf,char* content,int size)
{
int i;
for(i=0;i<size;i++)
{
if(buf[num*size] == NULL)break;
content[i] = buf[num*size+i];
}
}
/************************************************/
/*将字符串content中的字符追加到到字符串buf后面 */
/************************************************/
int putstring(int num,char* buf,char* content,int size)
{
int i;
for(i=0;i<size;i++)
{
if(content[num*size] == NULL)break;
buf[num*size+i] = content[i];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -