📄 文件管理实验程序.c
字号:
/*****************************************************/
/* 文件管理实验程序 */
/* 把一个文件模拟为磁盘,然后在该磁盘上建立文件系统,*/
/* 并提供基本的文件访问函数 */
/* 作者:吕泽忠 */
/* 最后修改时间: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 + -