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

📄 file.c

📁 SDIO文件系统forHMI-STM32
💻 C
📖 第 1 页 / 共 3 页
字号:
          }
      }
    
    if(Rt<MAX_OPEN_FILES)
       {
          fp = FileInfo + Rt;
        
          /* 获取目录开始簇号和文件名 */
          fp->DirClus = _GetFDTInfo(fp->Name,DirFileName);
          if(fp->DirClus<BAD_CLUS)
            {
                fp->Drive = GetDrive(DirFileName);  /* 获取文件所在逻辑盘号 */

                /* 文件已经以读写方式打开,不能再次以读写方式打开 */
                if(FindOpenFileW(fp->Drive,fp->DirClus,fp->Name)== Not_Open_FILE)
                   {
                      if(FindFDTInfo(&temp,fp->Drive,fp->DirClus,fp->Name)==RETURN_OK)
                         {
                            if((temp.Attr&ATTR_DIRECTORY)!=0)
                              {
                                 return Not_Open_FILE;
                              }
                            if(RemoveFile(DirFileName)!=RETURN_OK)   /* 删除文件 */
                              {
                                 return Not_Open_FILE;
                              }
                         }
                       /* 创建文件 */
                      for(i=0;i<11;i++)
                        {
                          temp.Name[i] = fp->Name[i];
                        }
                      temp.Attr = 0;
                      temp.FileSize = 0;

                      temp.NTRes = 0;
                      temp.CrtTimeTenth = 0;
                      temp.CrtTime = 0;
                      temp.CrtDate = 0;
                      temp.LstAccDate = 0;
                      temp.WrtTime = 0;
                      temp.WrtDate = 0;

                      temp.FstClusLO = 0;
                      temp.FstClusHI = 0;
                      if(AddFDT(fp->Drive,fp->DirClus,&temp)==RETURN_OK)    /* 增加文件 */
                         {
                           /* 设置文件信息 */
                           fp->Flags = FILE_FLAGS_READ|FILE_FLAGS_WRITE;
                           fp->FileSize = 0;
                           fp->FstClus = 0;
                           fp->Clus = 0;
                           fp->Offset = 0;
                           return Rt;
                         }
                  }
            }
       }
   return Not_Open_FILE;
}

/*********************************************************************************************************
** 函数名称: _FileOpenRW
** 功能描述: 只读写方式打开文件,内部使用
**
** 输 入: DirFileName:用户使用的文件名
**
** 输 出: 文件句柄,Not_Open_FILE为不能打开
**         
** 全局变量: 无
** 调用模块: _FileOpenR,_FileOpenW
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
HANDLE _FileOpenRW(char *DirFileName)
{
    HANDLE Rt;
    
    Rt = _FileOpenR(DirFileName);
    if(Rt == Not_Open_FILE)
       {
         Rt = _FileOpenW(DirFileName);
       }
    else
       {
          if(FindOpenFileW(FileInfo[Rt].Drive,FileInfo[Rt].DirClus,FileInfo[Rt].Name)==Not_Open_FILE)
            {
              FileInfo[Rt].Flags|=(FILE_FLAGS_WRITE|FILE_FLAGS_READ);
            }
          else
            {
              FileInfo[Rt].Flags = 0;
              Rt = Not_Open_FILE;
            }
       }
    return Rt;
}

/*********************************************************************************************************
** 函数名称: FileOpen
** 功能描述: 以指定方式打开文件
**
** 输 入: DirFileName:  用户使用的文件名
**                Type:  打开方式
** 输 出: 文件句柄,Not_Open_FILE为不能打开
**         
** 全局变量: 无
** 调用模块: _FileOpenR,_FileOpenW,_FileOpenRW
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
HANDLE FileOpen(char *DirFileName,char *Type)
{
    HANDLE Rt;

    Rt = Not_Open_FILE;    
    strupr(Type);
    strupr(DirFileName);
    if(Type[0]=='R')
      {
        if(Type[1]=='W')
          {
             Rt=_FileOpenRW(DirFileName);
          }
        else
          {
             Rt=_FileOpenR(DirFileName);
          }
        return Rt;
      }


    if(Type[0]=='W')
      {
        if(Type[1]=='R')
          {
            Rt=_FileOpenRW(DirFileName);
          }
        else
          {
            Rt=_FileOpenW(DirFileName);
          }
      }
    
	return Rt;
}

/*********************************************************************************************************
** 函数名称: FileClose
** 功能描述: 关闭指定文件
**
** 输 入: Handle:文件句柄
**
** 输 出: RETURN_OK:成功
**        其它参考fat.h中关于返回值的说明 
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 FileClose(HANDLE Handle)
{
    uint8 Rt;
    FDT FileFDT;
    MY_FILE *fp;
    
    Rt = PARAMETER_ERR;
    if (Handle >= 0 && Handle < MAX_OPEN_FILES)
    {
        Rt = RETURN_OK;
        fp = FileInfo + Handle;
        if ((fp->Flags & FILE_FLAGS_WRITE) == FILE_FLAGS_WRITE)
        {
            Rt = FindFDTInfo(&FileFDT, fp->Drive, fp->DirClus, fp->Name);
            if (Rt == RETURN_OK)
            if (FileFDT.FileSize < fp->FileSize)
            {
                FileFDT.FileSize = fp->FileSize;
                if (FileFDT.FstClusLO == 0)
                if (FileFDT.FstClusHI == 0)
                {
                    FileFDT.FstClusLO = fp->FstClus & 0xffff;
                    FileFDT.FstClusHI = (fp->FstClus >> 16) & 0xffff;
                }
                ChangeFDT(fp->Drive, fp->DirClus, &FileFDT);
            }
        }
        fp->Flags = 0;
    }
    return Rt;
}

/*********************************************************************************************************
** 函数名称: FileGetCh
** 功能描述: 从文件读一个字节
**
** 输 入: Ch:返回读到的数据
**        Handle:文件句柄
** 输 出: RETURN_OK:成功
**        其它参考fat.h中关于返回值的说明 
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 FileGetCh(uint8 *Ch, HANDLE Handle)
{
    uint32 i, j, SecIndex;
    MY_FILE *fp;
    Disk_Info * DiskInfo;
    uint8 Rt;
    uint8 *Buf;
    
    Rt = PARAMETER_ERR;
    fp = FileInfo + Handle;
    if (Handle >= 0 && Handle < MAX_OPEN_FILES)     /* Handle是否有效 */
    if (fp->Flags != 0)                             /* 对应的打开文件信息表是否已使用 */
    {
        Rt = FILE_EOF;
        if (fp->Offset >= fp->FileSize)
        {
            /* 如果读数据超出文件的长度,看一看谁否有别的程序正在写这个文件 */
            /* 如果有,则可能文件的长度有变化,更正之*/
            Handle = FindOpenFileW(fp->Drive, fp->DirClus, fp->Name);
            if (Handle < MAX_OPEN_FILES)
            {
                fp->FileSize = FileInfo[Handle].FileSize;
                if (fp->Offset == 0)
                {
                    fp->FstClus = FileInfo[Handle].FstClus;
                    fp->Clus = FileInfo[Handle].Clus;
                }
            }
        }
        Rt = FILE_EOF;
        if (fp->Offset < fp->FileSize)              /* 是否到文件结束 */
        {
            Rt = NOT_FIND_DISK;
                /* 获取文件所在逻辑盘信息 */
            DiskInfo = GetDiskInfo(fp->Drive);
            if (DiskInfo != NULL)
            {
                /* 计算数据所在扇区 */
                j = fp->Offset % (DiskInfo->SecPerClus * DiskInfo->BytsPerSec);
                i = j / DiskInfo->BytsPerSec;
                j = j % DiskInfo->BytsPerSec;
                SecIndex = (fp->Clus - 2) * DiskInfo->SecPerClus + 
                           DiskInfo->DataStartSec + i;
                Rt = SECTOR_READ_ERR;
                /* 打开扇区 */
                Buf = OpenSec(fp->Drive, SecIndex);
                if (Buf != NULL)
                {
                    /* 读取扇区数据 */
                    if (ReadSec(fp->Drive, SecIndex) == RETURN_OK)
                    {
                        /* 读取数据 */
                        *Ch = Buf[j];
                        /* 调整文件指针 */
                        fp->Offset++;
                        j++;
                        if (j >= DiskInfo->BytsPerSec)
                        {
                            i++;
                            if (i >= DiskInfo->SecPerClus)
                            {
                                fp->Clus = FATGetNextClus(fp->Drive, fp->Clus);
                            }
                        }
                        Rt = RETURN_OK;
                    }
                    /* 关闭扇区 */
                    CloseSec(fp->Drive, SecIndex);
                }
            }
        }
    }
    return Rt;
}

/*********************************************************************************************************
** 函数名称: FileRead
** 功能描述: 读取文件
**
** 输 入: Buf:保存读回的数据
**        Size:要读的字节数
**        Handle:文件句柄
** 输 出: 实际读到的字节数
**         

⌨️ 快捷键说明

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