📄 smallfilesystem.c
字号:
//填充文件结构的相关信息
theFile->fileblock = i; //文件当前的簇的位置
theFile->filemode = OpenMode; //打开文件的模式
theFile->filesize = FAT16[i].SizeOfFile; //文件的字节数
//判断文件打开的模式
if(OpenMode == MODE_OPEN_FILE_READ) //读模式
{
//读取文件的首簇到缓冲区
if( Read_Flash(theFile->Buffer, i) != CLUSTER_BLOCK_SIZE)
{ //判断读出FLASH的字节数量是否正确
OSMemPut(FILE_Ptr, theFile); //错误,则归还文件缓冲区
return NULL; //返回
}
theFile->filebufnum = 0; //读写的数据是0
theFile->fileCurpos = 0;
}
else if(OpenMode == MODE_OPEN_FILE_WRITE) //写模式
{
//把缓冲区用0xff填充
memset(theFile->Buffer,0xff,CLUSTER_BLOCK_SIZE);
}
else //模式错误,既不是读,也不是写
{
OSMemPut(FILE_Ptr, theFile); //错误,则归还文件缓冲区
return NULL; //返回
}
FAT16[i].IsLock = 1; //在文件分配表中置文件为打开方式
//返回文件结构指针
return theFile;
}
/**********************************************************************************
function: 关闭文件
input : *pfile 文件句柄
output : 无
description: 关闭文件
auther: 万健
***********************************************************************************/
void CloseOSFile(FILE *pfile)
{
if(pfile == NULL) return ;
//判断文件打开的方式
if(pfile->filemode == MODE_OPEN_FILE_WRITE)
{
//把文件缓冲区写入当前簇
Write_Flash(pfile->Buffer, pfile->fileblock);
}
//释放FILE的内存
if(pfile->filemode == MODE_OPEN_FILE_WRITE)
FAT16[pfile->fileblock].SizeOfFile = pfile->filesize;
OSMemPut(FILE_Ptr, pfile); //归还文件缓冲区
FAT16[pfile->fileblock].IsLock = 0; //在文件分配表中置文件为关闭方式
//把文件分配表写回FLASH的0簇中
Write_Flash(&FAT16[0],0);
return ;
}
/**********************************************************************************
function: 得到文件的字节数(文件的大小)
input :*theFile 文件结构指针
*size 返回文件的大小
output : 操作成功 返回 True
操作失败 返回 False
description: 新建文件
auther: 万健
***********************************************************************************/
INT8U GetSizeOfFile(FILE *theFile,INT32U *size)
{
if(theFile == NULL) return False;
*size = theFile->filesize;
return True;
}
/**********************************************************************************
function:读取文件到目标空间
input : pfile 文件句柄
*ReadBuffer 读缓冲区
ReadByte 要读取的字节数
output : INT32U 返回已读取的字节数量
description: 读取文件到目标空间
auther: 万健
***********************************************************************************/
INT32U ReadOSFile(FILE *pfile, INT8U *ReadBuffer,INT32U ReadByte)
{
INT32U i;
INT16U NumberOfCluster;
INT8U *SPtr,*DPtr;
if(pfile->filemode != MODE_OPEN_FILE_READ)
return False;
if(ReadBuffer == NULL) return 0;
SPtr = pfile->Buffer;
DPtr = ReadBuffer;
if( ReadByte > MAX_SIZE_OF_FILE) ReadByte = MAX_SIZE_OF_FILE;//最大的文件长度
NumberOfCluster = pfile->fileblock;
for(i = 0; i < ReadByte; i ++ )
{
*DPtr = *SPtr;
DPtr++;SPtr++;
pfile->fileCurpos++;
pfile->filebufnum++;
if(pfile->fileCurpos == pfile->filesize) //判断是否已经读到文件的末尾
return i;
if(pfile->filebufnum == CLUSTER_BLOCK_SIZE) //判断是否已经读完了一簇
{
if((FAT16[NumberOfCluster].NextCluster == 0xff) || //判断下一簇的簇号是否有效
(FAT16[NumberOfCluster].NextCluster == 0x00))
{
return i; //如果下一簇的簇号无效,返回
}
else
{
NumberOfCluster = FAT16[NumberOfCluster].NextCluster; //得下一簇的簇号
}
if( Read_Flash(pfile->Buffer, NumberOfCluster) != CLUSTER_BLOCK_SIZE)//读取下一簇,到FILE的缓冲区
{
return i; //如果读数据失败,返回。
}
else
pfile->filebufnum = 0; //读数据到
SPtr = pfile->Buffer;
}
}
}
/**********************************************************************************
function:写数据到文件
input : pfile 文件句柄
*WriteBuffer写缓冲区
ReadByte 要写的字节数
output : INT8U 操作正确,返回True;
操作错误,返回Falses
description: 写数据到文件
auther: 万健
***********************************************************************************/
INT8U WriteOSFile(FILE *pfile, INT8U *WriteBuffer,INT32U WriteByte)
{
INT32U i;
INT16U tmp,NumberOfCluster;
INT8U *SPtr,*DPtr;
if(pfile->filemode != MODE_OPEN_FILE_WRITE)
return False;
if(WriteBuffer == NULL) return False;
if(WriteByte > MAX_SIZE_OF_FILE) return False;//最大的文件长度
DPtr = pfile->Buffer;
SPtr = WriteBuffer;
NumberOfCluster = pfile->fileblock; //簇号
for(i = 0; i < WriteByte; i ++ )
{
*DPtr = *SPtr;
DPtr++;SPtr++;
pfile->fileCurpos++;
pfile->filebufnum++;
pfile->filesize = pfile->fileCurpos;
if( i == WriteByte - 1) return True; //判断是否已经写完
if(pfile->filebufnum == CLUSTER_BLOCK_SIZE) //判断是否已经写完了一簇
{
for( tmp = 1;tmp < NUMBER_OF_CLUSTER_IN_FAT16;tmp++)
{
if(FAT16[tmp].status == 0) break; //在文件分配表中查找空白簇
}
if(tmp == NUMBER_OF_CLUSTER_IN_FAT16) return False; //没有空白簇,返回错误
FAT16[NumberOfCluster].NextCluster = tmp;
NumberOfCluster = tmp;
FAT16[tmp].status = 2;
FAT16[tmp].NextCluster = 0xffffffff;
if( Write_Flash(pfile->Buffer, tmp) != True)//读取下一簇,到FILE的缓冲区
{
return i; //如果读数据失败,返回。
}
else
pfile->filebufnum = 0; //读数据到
DPtr = pfile->Buffer;
}
}
}
#endif
/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -