Files
zTC1/mico-os/platform/MCU/MX1101/FileSystem/inc/fat_file.h

240 lines
7.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef __FAT_FILE_H__
#define __FAT_FILE_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "fs_config.h"
#include "folder.h"
#include "fsinfo.h"
//open mode
#define FA_READ 0x01
#define FA_WRITE 0x02
#define FA_CREATE_NEW 0x04
#define FA_CREATE_ALWAYS 0x08
//file status
//#define FA__WRITTEN 0x20
//#define FA__DIRTY 0x40
//#define FA__ERROR 0x80
//define file seek position.
#define SEEK_FILE_SET 0 //seek file from the first sector of file
#define SEEK_FILE_CUR 1 //seek file from the current sector of file
#define SEEK_FILE_END 2 //seek file from the last sector of file
typedef enum _FILE_TYPE
{
FILE_TYPE_MP3,
FILE_TYPE_WMA,
FILE_TYPE_WAV,
FILE_TYPE_SBC,
FILE_TYPE_FLAC,
FILE_TYPE_AAC,
FILE_TYPE_AIF,
FILE_TYPE_AMR,
FILE_TYPE_UNKNOWN = 0xFF
} FILE_TYPE;
//文件的描述结构
typedef struct _FAT_FILE
{
uint16_t FileNumInDisk; //在整个设备上的文件号
uint16_t FileNumInFolder; //在当前文件夹中的文件号
uint16_t FolderNum; //所在文件夹的编号
// uint16_t ValidFolderNum; //所在文件夹的有效文件夹编号
uint32_t ParentFoldStartSecNum; //父目录起始扇区号
uint32_t DirSecNum; //FDI 所在扇区号
uint32_t DirOffset; //FDI 所在扇区中的偏移量
uint8_t ShortName[11]; //短文件名
#if FAT_USE_LFN == 1
//uint8_t LongName[FAT_NAME_MAX]; //长文件名
#endif
uint8_t FileType; //文件夹类型
uint32_t Size; //文件的总字节数
uint32_t FptrIndex;
uint32_t FptrCluster;
uint32_t StartClusNum; //文件第一个簇号
uint32_t SecterOffset; // Sector offset in the cluster
uint32_t Fptr; //当前位置在文件中偏移字节数
//uint32_t DataSec; //当前缓冲区中的数据扇区号
//uint8_t* IOBuffer; //文件读写缓冲区
uint8_t Flag; //标记文件状态
FS_CONTEXT* FsContext;
} FAT_FILE;
//设置、获取文件时间的结构体
typedef struct _FILE_TIME
{
uint16_t Year; //19802107
uint8_t Month; //112
uint8_t Date; //131
uint8_t Hour; //023
uint8_t Min; //059
uint8_t Sec; //059
} FILE_TIME;
//
// @brief Open a file
// @param file_name file name forexample: \\mp3\\short.mp3,\\mp3\\short.mp3
// @param mode open mode FA_READ、FA_WRITE、FA_CREATE_NEW、FA_CREATE_ALWAYS
// @return File Handle
// 字符串打开文件不支持中文名的文件夹或文件
// 支持长文件名
bool FileOpen(FAT_FILE* File, const uint8_t* FileName, const uint8_t Mode);
//判断文件的类型,由文件系统底层调用
uint8_t FileGetType(FS_CONTEXT* FsContext);
//
// @brief Check End-of-File indicator.
// @param File Pointer to a FILE object that specifies stream.
// @return The feof function returns a nonzero value if a read operation has attempted to read past the end of the file; it returns 0 otherwise.
//
int32_t FileEOF(FAT_FILE* File);
//返回到文件开头
void FileRewind(FAT_FILE* File);
//按文件序号打开文件
//打开成功返回TRUE目标文件信息填充到File所指的结构体。
//打开失败返回FALSE。
//Folder == NULL: 打开整个设备上的第FileNum个文件。
//Folder != NULL: 打开Folder文件夹中的第FileNum个文件夹。
bool FileOpenByNum(FAT_FILE* File, FOLDER* Folder, uint16_t FileNum);
//按文件名称打开指定文件夹中的文件。
//打开成功返回TRUE目标文件信息填充到File所指的结构体。
//打开失败返回FALSE。
//Folder指针不能为空指针。
bool FileOpenByName(FAT_FILE* File, FOLDER* Folder, uint8_t* FileName);
//按文件长名称打开指定文件夹中的文件。
//打开成功返回TRUE目标文件信息填充到File所指的结构体。
//打开失败返回FALSE。
//Folder不能为空FileName为Unicode 16编码
bool FileOpenByLfName(FAT_FILE* File, FOLDER* Folder, uint8_t* FileName, uint8_t Len);
//
// @brief Moves the file pointer to a specified location.
// @param File Pointer to a FILE object that specifies stream.
// @param Offset Number of bytes from origin.
// @param Base Initial position.
// @return If successful, the function returns a zero value. Otherwise, it returns nonzero value.
//
int32_t FileSeek(FAT_FILE* File, int32_t Offset, uint8_t Base);
//
// @brief Read data from stream
// @param buffer Pointer to a block of buffer with a minimum size of (size*count) bytes.
// @param size Size in bytes of each element to be read.
// @param count Number of elements, each one with a size of size bytes.
// @param File Pointer to a FILE object that specifies an input stream.
// @return The total number of elements successfully read.
//
uint32_t FileRead(void* buffer, uint32_t size, uint32_t count, FAT_FILE* File);
//
// @brief Write data to stream
// @param buffer Pointer to a block of buffer with a minimum size of (size*count) bytes.
// @param size Size in bytes of each element to be write.
// @param count Number of elements, each one with a size of size bytes.
// @param File Pointer to a FILE object that specifies an output stream.
// @return The total number of elements successfully write.
//
uint32_t FileWrite(const void* buffer, uint32_t size, uint32_t count, FAT_FILE* File);
//
// @brief Get size of the opened file.
// @param File Pointer to a FILE object that specifies an output stream.
// @return size of the opened file.
//
int32_t FileSof(FAT_FILE* File);
//
// @brief Gets the current position of a file pointer.
// @param File Pointer to a FILE object that specifies stream.
// @return code
//
int32_t FileTell(FAT_FILE* File);
//
// @brief File save Fat and Dir
// @param File Pointer to a FILE object that specifies an output stream.
// @return fclose returns 0 if the stream is successfully closed.
//
int32_t FileSave(FAT_FILE* File);
//
// @brief Closes a stream.
// @param File Pointer to a FILE object that specifies an output stream.
// @return fclose returns 0 if the stream is successfully closed.
//
int32_t FileClose(FAT_FILE* File);
//获取指定文件的长文件名。
//长文件名LongFileName不能小于GetMaxLength
//获取到长文件名返回TRUE。
//无长文件名返回FALSE。
bool FileGetLongName(FAT_FILE* File, uint8_t* LongFileName, uint8_t GetMaxLength);
//文件清空。
//成功:返回TRUE失败:返回FALSE。
bool FileFlush(FAT_FILE* File);
//文件删除。成功:返回TRUE失败:返回FALSE。
bool FileDelete(FAT_FILE* File);
//按文件名称在指定文件夹中新建一个文件。
//目标文件信息填充到File所指的结构体。
//FileName[]为短文件名,例如:"123.TXT", "ABC123.MP3"。
//短文件名长度不能超过8+3字节短文件名中不能同时出现大小写字母。
bool FileCreate(FAT_FILE* File, FOLDER* Folder, uint8_t* FileName);
//按长文件名称在指定文件夹中新建一个文件。
//目标文件信息填充到File所指的结构体。
//FileName[]为长文件名
//Folder 不能为空FileName为Unicode 16编码LongFileName比为128 字节空闲位置为0xFF
bool FileCreateByLfName(FAT_FILE* File, FOLDER* Folder, uint8_t* LongFileName, uint8_t Len);
bool FSFormat(void);
//修改文件的时间信息。
//CreateTime: 创建时间精度为1秒
//ModifyTime: 最后修改时间精度为2秒
//AccessTime: 最后访问时间,只有日期,忽略时间部分
//如果某个时间信息传入的指针为NULL则表示不改变该时间信息
//成功:返回TRUE 失败:返回FALSE。
bool FileSetTime(FAT_FILE* File, FILE_TIME* CreateTime, FILE_TIME* ModifyTime, FILE_TIME* AccessTime);
//获取文件的时间信息。
//CreateTime: 创建时间精度为1秒
//ModifyTime: 最后修改时间精度为2秒
//AccessTime: 最后访问时间,只有日期,忽略时间部分
//如果某个时间信息传入的指针为NULL则表示不获取该时间信息
//成功:返回TRUE 失败:返回FALSE。
bool FileGetTime(FAT_FILE* File, FILE_TIME* CreateTime, FILE_TIME* ModifyTime, FILE_TIME* AccessTime);
void SetFsTerminateFuc(TerminateFunc func);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif //_FAT_FILE_H_