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

📄 smallfilesystem.c

📁 可移到ucos上的文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
    //填充文件结构的相关信息
    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 + -