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

📄 dosfile.c

📁 一种文件系统的结构
💻 C
字号:
#include "..\define.h"
#include "..\all.h"


data	bit	gb_TriggerFileSkip=0;
data	U8	gc_FileSkipNumber=0;

xdata	U8	gc_FileHandle;
xdata	File_FCB	gs_File_FCB[6];
xdata	DIR_FCB		gs_DIR_FCB[3];

extern	data	U8	gc_SectorUnit;
extern	data	U8	gc_maxtimes;

U8	DOS_Close_File(U8 tc_FileHandle, U8 tc_CloseMode, U8 * tpc_FileName);
U8	DOS_Open_File(U8 tc_FileHandle, U8 tc_OpenMode, U8 * tpc_FileName);
U8	DOS_Read_File(U8 tc_FileHandle);
U8	DOS_Search_File(U8 tc_Mode, U8 tc_Type, U8 tc_PrevOrNext);
U32	DOS_Seek_File(U8 tc_FileHandle, U32 tdw_SectorNumber);


U8 DOS_Close_File(U8 tc_FileHandle, U8 tc_CloseMode, U8 * tpc_FileName)
{
	U8	tc_Status;
	U8	tac_FileFdb[32];

	if(gs_File_FCB[tc_FileHandle].dw_File_StartCluster==0xffffffff)
	{	
		return 1;	
	}
	if (tc_CloseMode == 1)
	{//Create new file mode
		if (gs_File_FCB[tc_FileHandle].dw_File_TotalSize != 0)
		{//file size is not 0
			U32	tdw_TempLogicAddr;
			
			//fill fdb content
			DOS_FillFdb(tac_FileFdb , tpc_FileName, gs_File_FCB[tc_FileHandle].dw_File_StartCluster, gs_File_FCB[tc_FileHandle].dw_File_TotalSize);
			tac_FileFdb[0x0B] = 0x20;//attribute is archive		
			tdw_TempLogicAddr = DOS_ClusterLogicAddr(gs_File_FCB[tc_FileHandle].dw_FDB_Cluster);
			if ((tdw_TempLogicAddr == gs_File_FCB[tc_FileHandle].dw_FDB_LogAdd) \
				&& (gs_File_FCB[tc_FileHandle].w_FDB_Offset == 0) \
				&& (gs_File_FCB[tc_FileHandle].dw_FDB_Cluster != gdw_DOS_RootDirClus)) 
			{//directory area is full,must add fdb in a new free cluster 
				U32	tdw_TempCluster;
				U32	tdw_PreviousCluster;
				
				memcpy(gc_PlayRecordDataBuf,tac_FileFdb,32);
				memset(&gc_PlayRecordDataBuf[32],0,480);

				gc_ReadWriteDataArea = 0;//select gc_PlayRecordDataBuf[]
				DOS_AppendWrite_LogicSector(tdw_TempLogicAddr,1);

				//clear other area of the cluster to 0
				memset(gc_PlayRecordDataBuf,0,32);		
				DOS_AppendWrite_LogicSector(tdw_TempLogicAddr + 1,((gc_DOS_SectorPerCluster) - 1));
		
				//find the last cluster of the directory
				tdw_TempCluster = gs_File_FCB[tc_FileHandle].dw_FDB_StartCluster;
				
				while (tdw_TempCluster < gdw_DOS_FatMaxCluster)
				{
					tdw_PreviousCluster = tdw_TempCluster;
					tdw_TempCluster = DOS_GetNextCluster(tdw_TempCluster, 1);
				}
				
				//connect the free cluster after the last cluster of the directory
				DOS_ConnectFATChain(tdw_PreviousCluster,gs_File_FCB[tc_FileHandle].dw_FDB_Cluster);	
			}
			else
			{//add fdb in directory area

				gc_ReadWriteDataArea = 0;//select gc_PlayRecordDataBuf[]
				
				DOS_Read_LogicSector(gs_File_FCB[tc_FileHandle].dw_FDB_LogAdd, 1);
				
				memcpy(&gc_PlayRecordDataBuf[gs_File_FCB[tc_FileHandle].w_FDB_Offset],tac_FileFdb,32);		
				
				DOS_Write_LogicSector(gs_File_FCB[tc_FileHandle].dw_FDB_LogAdd,1);
			}
		

			//connect file FAT chain from first cluster to final cluster
			DOS_ConnectFATChain(gs_File_FCB[tc_FileHandle].dw_File_StartCluster, gs_File_FCB[tc_FileHandle].dw_File_CurrentCluster);
		}	
		
		gc_ClusBufValidPoint = 0;			//must Search Free Cluster from start
		gc_ClusBufValidSize = 0;
		gdw_FreeClusterNum[0]=0;
	
		if (gdw_FreeClusterNum[1] < (gdw_DOS_FatMaxCluster - 1))
		{//

⌨️ 快捷键说明

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