📄 file.c
字号:
/*
;*****************************************************************************************************
;* Copyright (c) 2006 by JiaoJinXing.
;* All rights reserved.
;*
;*---- 文件信息 --------------------------------------------------------------------------------------
;* 文 件 名 : file.c
;* 创 建 人 : 焦进星
;* 描 述 : 文件操作文件
;*
;*---- 历史版本信息 ----------------------------------------------------------------------------------
;* 日 期 : 2008年 12 月 15 日
;* 创 建 人 : 焦进星
;* 描 述 : 建立版本 V1.0.0
;*
;*---- 联系方式 --------------------------------------------------------------------------------------
;* Email : wyoujtg@163.com
;* Web : http://wyoujtg.blog.163.com
;*****************************************************************************************************
;*/
#include "minifs.h"
/*
;*****************************************************************************************************
;* 变量名称 : FileManageInfo
;* 描 述 : 文件管理器
;*****************************************************************************************************
;*/
static struct FileManageInfo FileManage[MAX_FILE_OPEN];
/*
;*****************************************************************************************************
;* 函数名称 : FS_Init
;* 描 述 : 文件系统初始化
;* 输 入 : 无
;*
;* 输 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 FS_Init(void)
{
M_FILE pf = FileManage;
uint8 i;
/* 扇区缓存器初始化 */
Cache_Init();
/* 文件管理器初始化 */
for (i = 0; i < MAX_FILE_OPEN; i++, pf++)
{
ClearNbyte((uint8 *)pf, sizeof(struct FileManageInfo));
}
/* 磁盘初始化 */
return Disk_Init();
}
/*
;*****************************************************************************************************
;* 函数名称 : GetFreeFileMan
;* 描 述 : 分配空闲文件管理器
;* 输 入 : 无
;*
;* 输 出 : 文件指针
;*****************************************************************************************************
;*/
M_FILE GetFreeFileMan(void)
{
M_FILE pf = FileManage;
uint8 i;
for (i = 0; i < MAX_FILE_OPEN; i++, pf++)
{
if (pf->Flag == 0x00)
{
pf->Flag = FILE_OPEN;
return pf;
}
}
return ((M_FILE)0);
}
/*
;*****************************************************************************************************
;* 函数名称 : _IsFileOpen
;* 描 述 : 判断文件是否已打开
;* 输 入 : Filename[11]: 内部文件名
;*
;* 输 出 : 文件指针
;*****************************************************************************************************
;*/
M_FILE _IsFileOpen(char Filename[11])
{
M_FILE pf = FileManage;
uint8 i;
for (i = 0; i < MAX_FILE_OPEN; i++, pf++)
{
if (pf->Flag & FILE_OPEN)
{
if (IsEqual(pf->fFDT.Name, Filename, 11))
{
return pf;
}
}
}
return ((M_FILE)0);
}
/*
;*****************************************************************************************************
;* 函数名称 : IsFileOpen
;* 描 述 : 判断文件是否已打开
;* 输 入 : NameStr[11]: 外部文件名
;*
;* 输 出 : 文件指针
;*****************************************************************************************************
;*/
M_FILE IsFileOpen(char NameStr[11])
{
char Filename[11];
/* 转化为内部文件名 */
if (!FileNameChange(NameStr, Filename))
{
return ((M_FILE)0);
}
return _IsFileOpen(Filename);
}
/*
;*****************************************************************************************************
;* 函数名称 : FreeFileMan
;* 描 述 : 释放文件管理器
;* 输 入 : M_FILE: 文件指针
;*
;* 输 出 : 无
;*****************************************************************************************************
;*/
void FreeFileMan(M_FILE pf)
{
ClearNbyte((uint8 *)pf, sizeof(struct FileManageInfo));
}
/*
;*****************************************************************************************************
;* 函数名称 : _CreateFile
;* 描 述 : 创建文件
;* 输 入 : Filename[11]: 内部文件名
;*
;* 输 出 : 文件目录项索引, MAX_FDT_NUM时为失败
;*****************************************************************************************************
;*/
uint16 _CreateFile(char Filename[11])
{
FDT fFDT;
uint16 ClusIndex, FDTIndex;
/* 查看是否已存在该文件 */
if (FindSYSNameRootFDT(Filename, &fFDT) != FDT_NO_FOUND)
{
return MAX_FDT_NUM;
}
/* 建立簇链 */
ClusIndex = AddNewClus(EMPTY_CLUS);
if (ClusIndex == BAD_CLUS)
{
return MAX_FDT_NUM;
}
/* 获得一个空闲文件目录项 */
FDTIndex = GetFreeRootFDT();
if (FDTIndex == MAX_FDT_NUM)
{
goto ERR;
}
/* 文件目录项名字 */
CopyNbyte(fFDT.Name, Filename, 11);
/* 文件目录项属性 */
fFDT.FstClusLO = ClusIndex;
fFDT.Attr = 0;
fFDT.FileSize = 0;
/* 写文件目录项 */
if (!WriteRootFDTInfo(FDTIndex, &fFDT))
{
goto ERR;
}
/* 返回文件目录项索引 */
return FDTIndex;
ERR:
/* 出错, 删除簇链 */
DelClusChain(fFDT.FstClusLO);
return MAX_FDT_NUM;
}
/*
;*****************************************************************************************************
;* 函数名称 : CreateFile
;* 描 述 : 创建文件
;* 输 入 : NameStr[11]: 文件名
;*
;* 输 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 CreateFile(char NameStr[11])
{
char Filename[11];
/* 转化为内部文件名 */
if (!FileNameChange(NameStr, Filename))
{
return FALSE;
}
/* 创建文件 */
if (_CreateFile(Filename) == MAX_FDT_NUM)
{
return FALSE;
}
return TRUE;
}
/*
;*****************************************************************************************************
;* 函数名称 : OpenFile
;* 描 述 : 打开文件
;* 输 入 : NameStr[11]: 外部文件名
;*
;* 输 出 : 文件指针
;*****************************************************************************************************
;*/
M_FILE OpenFile(char NameStr[11])
{
char Filename[11];
uint16 FDTIndex;
M_FILE fp;
/* 转化为内部文件名 */
if (!FileNameChange(NameStr, Filename))
{
return ((M_FILE)0);
}
/* 文件是否已打开 */
fp = _IsFileOpen(Filename);
if (fp)
{
return fp;
}
/* 分配文件管理器 */
fp = GetFreeFileMan();
if (!fp)
{
return ((M_FILE)0);
}
/* 查找是否已存在该文件 */
FDTIndex = FindSYSNameRootFDT(Filename, &(fp->fFDT));
if (FDTIndex == FDT_NO_FOUND)
{
/* 不存在, 则创建 */
FDTIndex = _CreateFile(Filename);
if (FDTIndex == MAX_FDT_NUM)
{
/* 不成功, 则释放文件管理器 */
FreeFileMan(fp);
return ((M_FILE)0);
}
/* 获得文件信息 */
ReadRootFDTInfo(FDTIndex, &(fp->fFDT));
}
/* 文件目录项索引 */
fp->FdtIndex = FDTIndex;
/* 读写指针所在簇 */
fp->CurClus = fp->fFDT.FstClusLO;
/* 读写指针偏移 */
fp->Offset = 0;
return fp;
}
/*
;*****************************************************************************************************
;* 函数名称 : CloseFile
;* 描 述 : 关闭文件
;* 输 入 : fp: 文件指针
;*
;* 输 出 : 文件指针
;*****************************************************************************************************
;*/
uint8 CloseFile(M_FILE fp)
{
if (!fp)
{
return FALSE;
}
/* 文件是否已打开 */
fp = _IsFileOpen(fp->fFDT.Name);
if (fp)
{
if (WriteRootFDTInfo(fp->FdtIndex, &(fp->fFDT)))
{
CacheWriteBack();
FreeFileMan(fp);
return TRUE;
}
}
return FALSE;
}
/*
;*****************************************************************************************************
;* 函数名称 : GetFristSecOfClus
;* 描 述 : 获得指定簇的开始扇区号
;* 输 入 : ClusIndex: 簇号
;*
;* 输 出 : 簇的开始扇区号
;*****************************************************************************************************
;*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -