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

📄 文件管理实验程序.c

📁 文件管理实验程序 把一个文件模拟为磁盘
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************/
/*             文件管理实验程序                      */
/* 把一个文件模拟为磁盘,然后在该磁盘上建立文件系统,*/
/* 并提供基本的文件访问函数                          */
/* 作者:吕泽忠                                      */
/* 最后修改时间:2005-4-13                           */
/*****************************************************/

#include <stdio.h>
#include <string.h>
#define SECTOR_SIZE     256     /* 每个扇区的大小 */
#define TOTAL_SECTOR    128     /* 扇区总数 */
#define MAX_FINENAME_LEN    20
#define MAX_BUF_LEN     4*SECTOR_SIZE
         /*函数声明部分*/
int write_file(void);
int read_file(void);
int get_filename(char* filename);
int get_file_content(char* buf);
int init_disk(void);
void close_disk(void);
int read_disk(int sector, void* buf);
int write_disk(int sector, void* buf);
int my_del(const char* filename);
int del_file(void);
int putstring(int num,char* buf,char* content,int size);
int getstring(int num,char* buf,char* content,int size);

/*****************************************************/
/* 定义文件列表:                                    */
/*           filen[MAX_FINENAME_LEN-6]:为文件名     */
/*           num_sector:为文件所占的扇区个数        */
/*           sector[i]: 为文件所占的每个扇区的扇区号*/
/*           size:为文件占的最后一个扇区的大小      */
/*****************************************************/
struct file
{
    char filen[MAX_FINENAME_LEN-6];
    int num_sector;
    int sector[4];
    int size;
    struct file *next;
};
struct file *head;
FILE* disk = NULL;
char namecontent[9*SECTOR_SIZE] = {0};               /*定义文件系统缓冲区*/

/************************************************/
/* 这是主函数,在这调用子函数完成所需要的功能   */
/************************************************/
int main(void)
{
    int ch = 0;
    int rtn = 1;
    if (!init_disk())
    {
        perror("vdisk.dat");
        return -1;
    }
    if (!init_fs())
    {
        printf("init_fs() error!\n");
        getch();
        return -2;
    }
    printf("****************************************");
    printf("****************************************\n");
    printf("\t\tWelcome to dage virtual file system!\n");
    printf("\t\t\tAuthor:Lv Zezhong\n");
    printf("\t\t\tDate:  2005.4.13\n");
    printf("****************************************");
    printf("****************************************\n");
    do           
    {
    switch (ch)
        {
        case 'w':
            getchar();
            rtn = write_file();
            break;
        case 'r':
            getchar();
            rtn = read_file();
            break;
        case 'd':
            getchar();
            rtn = del_file();
            break;
        case 'l':
            getchar();
            rtn = dir();
            break;
        case '\n':
            continue;
        }
        if (!rtn)
            printf("\nError!!!!\n");
        printf("Input \'w\' to write, \'r\' to read ,\'l\' to dir ,\'d\' to delete and \'q\' to quit:");
    } while ((ch=getchar()) != 'q');
    close_disk();
    return 0;
}
/************************************************/
/*        模拟“写”文件系统中的一个文件        */
/*         成功返回非0值,否则返回0             */
/************************************************/
int write_file(void)
{
    char filename[MAX_FINENAME_LEN];
    char buf[MAX_BUF_LEN];
    int rtn=0;

    if(get_filename(filename))
    {
        int n = get_file_content(buf);
        if(n == -1)return 0;
        rtn = my_write(filename, buf, n);
    }
    else
    {
        rtn = 0;
    }
    return rtn;
}
/************************************************/
/*        模拟“读”文件系统中的一个文件        */
/*         成功返回非0值,否则返回0             */
/************************************************/
int read_file(void)
{
    char filename[MAX_FINENAME_LEN];
    char buf[MAX_BUF_LEN];
    int rtn=0;
    if(get_filename(filename))
    {
        int i;
        rtn = my_read(filename, buf, MAX_BUF_LEN);
        for (i=0; i<rtn; i++)
            putchar(buf[i]);
    }
    else
    {
        rtn = 0;
    }
    return rtn;
}
/************************************************/
/*        模拟“删除”文件系统中的一个文件      */
/*         成功返回非0值,否则返回0             */
/************************************************/
int del_file(void)
{
    char filename[MAX_FINENAME_LEN];
    int rtn=0;
    if(get_filename(filename))
    {
        int i;
        rtn = my_del(filename);
       return rtn;
    }
    else
    {
        rtn = 0;
    }
    return rtn;
}
/************************************************/
/*     从键盘读取文件名返回文件名长度           */
/************************************************/
int get_filename(char* filename)
{
    int len;
    printf("Enter filename:");
    fgets(filename, MAX_FINENAME_LEN, stdin);
    len = strlen(filename);

    if (filename[len-1] == '\n')
    {
        filename[len-1] = '\0';
        len--;
    }
    return len;
}
/************************************************/
/*   从键盘读取字符到buf中直到输入'~'就结束     */
/************************************************/
int get_file_content(char* buf)
{
    int ch, count=0;
    printf("Input file content. Input '~' to end.\n");
    while ((ch = getchar()) != '~')
    {
        buf[count] = ch;
        count++;
        if(count>MAX_BUF_LEN)return -1;
    }
    return count;
}

/************************************************/
/*                初始化虚拟文件                */
/************************************************/
int init_disk(void)
{
    char dump[SECTOR_SIZE] = {0};
    int count=0;
    while (disk == NULL && count < 4)
    {
        disk = fopen("vdisk.dat", "r+b");
        count++;
        if (disk == NULL)      /* 虚拟文件不存在,建立 */
        {
            int i;
            disk = fopen("vdisk.dat", "wb");
            if (disk == NULL)
                return 0;
            for (i=0; i<TOTAL_SECTOR; i++)
                fwrite(dump, SECTOR_SIZE, sizeof(char), disk);
            fclose(disk);
            disk = NULL;
        }
    }
    return (int)disk;
}
/************************************************/
/*          模拟电脑的关机功能                  */
/************************************************/
void close_disk(void)
{
    fclose(disk);
}
/*************************************************/
/*   把磁盘的第sector个扇区内容读入到buf         */
/*   sector从0开始编号                           */
/*   运行正确返回非0值,错误返回0                */
/*************************************************/
int read_disk(int sector, void* buf)
{
    if (!init_disk())
        return 0;

    fseek(disk, sector*SECTOR_SIZE, SEEK_SET);
    return fread(buf, SECTOR_SIZE, 1, disk);
}
/********************************************************/
/*把buf中SECTOR_SIZE个字节的数据写到磁盘的第sector个扇区*/
/*sector从0开始编号                                     */
/*运行正确返回非0值,错误返回0                          */
/********************************************************/
int write_disk(int sector, void* buf)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -