⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 文件管理实验程序.c

📁 文件管理实验程序 把一个文件模拟为磁盘
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -