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

📄 file.c

📁 AT89C51 MP3源程序AT89C51 MP3源程序 SD AT89C51 MP3源程序AT89C51 MP3源程序 SD
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
;*****************************************************************************************************
;*									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 + -