#ifndef __FS_H__ #define __FS_H__ #include "generic/typedef.h" #include "generic/list.h" #include "generic/ioctl.h" #include "generic/atomic.h" #include "system/task.h" #include "system/malloc.h" #include "system/sys_time.h" #include "stdarg.h" #include "fs_file_name.h" #include "sdfile.h" /** * \name Seek orig for fseek function * \{ */ #define SEEK_SET 0 /*!< Seek from beginning of file. */ #define SEEK_CUR 1 /*!< Seek from current position. */ #define SEEK_END 2 /*!< Seek from end of file. */ /* \} name */ /** * \name File attributes bits for fset_attr and fget_attr funciton * \{ */ #define F_ATTR_RO 0x01 /*!< 只读 */ #define F_ATTR_ARC 0x02 /*!< 文件 */ #define F_ATTR_DIR 0x04 /*!< 目录 */ #define F_ATTR_VOL 0x08 /*!< 卷标 */ #define F_ATTR_HID 0x10 /*!< 隐藏 */ /* \} name */ #ifndef FSELECT_MODE #define FSELECT_MODE /** * \name Select mode for fselect function * \{ */ #define FSEL_FIRST_FILE 0 /*!< 选择第一个文件 */ #define FSEL_LAST_FILE 1 /*!< 选择最后一个文件 */ #define FSEL_NEXT_FILE 2 /*!< 选择下一个文件 */ #define FSEL_PREV_FILE 3 /*!< 选择上一个文件 */ #define FSEL_CURR_FILE 4 /*!< 选择当前文件 */ #define FSEL_BY_NUMBER 5 /*!< 根据文件序号选择 */ #define FSEL_BY_SCLUST 6 /*!< 根据分配单元选择文件 */ #define FSEL_AUTO_FILE 7 /*!< 自动选择文件 */ #define FSEL_NEXT_FOLDER_FILE 8 /*!< 选择下一个文件夹的文件 */ #define FSEL_PREV_FOLDER_FILE 9 /*!< 选择上一个文件夹的文件 */ #define FSEL_BY_PATH 10 /*!< 根据文件路径选择 */ /* \} name */ #endif #ifndef FCYCLE_MODE #define FCYCLE_MODE /** * \name Cycle mode for fselect function * \{ */ #define FCYCLE_LIST 0 /*!< 全部文件循环模式 */ #define FCYCLE_ALL 1 /*!< unused */ #define FCYCLE_ONE 2 /*!< 当前文件循环模式 */ #define FCYCLE_FOLDER 3 /*!< 文件夹循环模式 */ #define FCYCLE_RANDOM 4 /*!< 随机循环模式 */ #define FCYCLE_MAX 5 /*!< unused */ /* \} name */ #endif enum { FS_IOCTL_GET_FILE_NUM, /*!< unused */ FS_IOCTL_FILE_CHECK, /*!< unused */ FS_IOCTL_GET_ERR_CODE, /*!< 暂不支持 */ FS_IOCTL_FREE_CACHE, /*!< unused */ FS_IOCTL_SET_NAME_FILTER, /*!< 设置文件过滤 */ FS_IOCTL_GET_FOLDER_INFO, /*!< 获取文件夹序号和文件夹内文件数目 */ FS_IOCTL_SET_LFN_BUF, /*!< 512 */ FS_IOCTL_SET_LDN_BUF, /*!< 512 */ FS_IOCTL_SET_EXT_TYPE, /*!< 设置后缀类型 */ FS_IOCTL_OPEN_DIR, /*!< 打开目录 */ FS_IOCTL_ENTER_DIR, /*!< 进入目录 */ FS_IOCTL_EXIT_DIR, /*!< 退出目录 */ FS_IOCTL_GET_DIR_INFO, /*!< 获取目录信息 */ FS_IOCTL_GETFILE_BYNAME_INDIR, /*!< 由歌曲名称获得歌词 */ FS_IOCTL_GET_DISP_INFO, /*!< 用于长文件名获取 */ FS_IOCTL_MK_DIR, /*!< 创建文件夹 */ FS_IOCTL_GET_ENCFOLDER_INFO, /*!< 获取录音文件信息 */ FS_IOCTL_GET_OUTFLASH_ADDR, /*!< 获取外置flash实际物理地址(暂时用于手表case,特殊fat系统) */ FS_IOCTL_FLUSH_WBUF, /*!< 刷新wbuf */ FS_IOCTL_SAVE_FAT_TABLE, /*!< seek加速处理 */ FS_IOCTL_INSERT_FILE, /*!< 插入文件 */ FS_IOCTL_DIVISION_FILE, /*!< 分割文件 */ FS_IOCTL_STORE_CLUST_RANG, /*!< 存储CLUST_RANG 信息 */ }; /// \cond DO_NOT_DOCUMENT #define VFS_PART_DIR_MAX 16 struct vfs_operations; struct vfs_devinfo { void *fd; u32 sector_size; u32 fatbase; u32 database; void *private_data; }; /// \endcond /** * @brief 分区信息 */ struct vfs_partition { struct vfs_partition *next; /*!< 下一个分区信息指针 */ u32 offset; /*!< 分区起始偏移 */ u32 clust_size; /*!< 簇大小 */ u32 total_size; /*!< 总容量 */ u8 fs_attr; /*!< 文件属性 */ u8 fs_type; /*!< 文件系统类型 */ char dir[VFS_PART_DIR_MAX]; /*!< 挂载点路径 */ void *private_data; /*!< 私有指针 */ }; /** * @brief 文件夹信息 */ struct ffolder { u16 fileStart; /*!< 文件夹起始序号 */ u16 fileTotal; /*!< 文件夹数目 */ }; /** * @brief 挂载点信息 */ struct imount { int fd; /*!< 私有设备指针 */ const char *path; /*!< 挂载点路径 */ const struct vfs_operations *ops; /*!< 文件系统操作函数句柄 */ struct vfs_devinfo dev; /*!< 设备信息 */ struct vfs_partition part; /*!< 分区信息 */ struct list_head entry; /*!< 链表节点 */ atomic_t ref; /*!< 引用计数器 */ OS_MUTEX mutex; /*!< 互斥量 */ u8 avaliable; /*!< 是否合法 */ u8 part_num; /*!< 分区数量 */ }; /** * @brief 文件属性 */ struct vfs_attr { u8 attr; /*!< 文件属性标志位 */ u32 fsize; /*!< 文件大小 */ u32 sclust; /*!< 最小分配单元 */ struct sys_time crt_time; /*!< 文件创建时间 */ struct sys_time wrt_time; /*!< 文件最后修改时间 */ struct sys_time acc_time; /*!< 文件最后访问时间 */ }; /** * @brief 文件流 */ typedef struct { struct imount *mt; /*!< 挂载点指针 */ struct vfs_devinfo *dev; /*!< 设备信息 */ struct vfs_partition *part; /*!< 分区信息 */ void *private_data; /*!< 私有指针 */ } FILE; /** * @brief 文件扫描信息 */ struct vfscan { u8 scan_file; /*!< 是否扫描文件 */ u8 subpath; /*!< 子目录,设置是否只扫描一层 */ u8 scan_dir; /*!< 是否扫描目录 */ u8 attr; /*!< 文件属性 */ u8 cycle_mode; /*!< 扫描的循环模式 */ char sort; /*!< 扫描的文件排序 't' 'n' */ char ftype[20 * 3 + 1]; /*!< 扫描的文件扩展类型 */ u16 file_number; /*!< 扫描出来的文件总数 */ u16 file_counter; /*!< 当前文件序号 */ u16 dir_totalnumber; /*!< 文件夹总数 */ u16 musicdir_counter; /*!< 播放文件所在文件夹序号 */ u16 fileTotalInDir; /*!< 文件夹下的文件数目 */ void *priv; /*!< 私有指针 */ struct vfs_devinfo *dev; /*!< 设备信息 */ struct vfs_partition *part; /*!< 分区信息 */ char filt_dir[12]; /*!< 设置文件夹过滤 */ char fasten_num[8]; char *fasten_buf; char *d_save; }; /// \cond DO_NOT_DOCUMENT struct vfs_operations { const char *fs_type; int (*mount)(struct imount *, int); int (*unmount)(struct imount *); int (*format)(struct vfs_devinfo *, struct vfs_partition *); int (*fset_vol)(struct vfs_partition *, const char *name); int (*fget_free_space)(struct vfs_devinfo *, struct vfs_partition *, u32 *space); int (*fopen)(FILE *, const char *path, const char *mode); int (*fread)(FILE *, void *buf, u32 len); int (*fread_fast)(FILE *, void *buf, u32 len); int (*fwrite)(FILE *, void *buf, u32 len); int (*fseek)(FILE *, int offset, int); int (*fseek_fast)(FILE *, int offset, int); int (*flen)(FILE *); int (*fpos)(FILE *); int (*fcopy)(FILE *, FILE *); int (*fget_name)(FILE *, u8 *name, int len); int (*fget_path)(FILE *, struct vfscan *, u8 *name, int len, u8 is_relative_path); int (*frename)(FILE *, const char *path); int (*fclose)(FILE *); int (*fdelete)(FILE *); int (*fscan)(struct vfscan *, const char *path, u8 max_deepth); int (*fscan_interrupt)(struct vfscan *, const char *path, u8 max_deepth, int (*callback)(void)); void (*fscan_release)(struct vfscan *); int (*fsel)(struct vfscan *, int sel_mode, FILE *, int); int (*fget_attr)(FILE *, int *attr); int (*fset_attr)(FILE *, int attr); int (*fget_attrs)(FILE *, struct vfs_attr *); int (*fmove)(FILE *file, const char *path_dst, FILE *, int clr_attr, int path_len); int (*ioctl)(void *, int cmd, int arg); int (*fget_total_space)(struct imount *mt, u32 *space); }; #define REGISTER_VFS_OPERATIONS(ops) \ const struct vfs_operations ops SEC_USED(.vfs_operations) static inline struct vfs_partition *vfs_partition_next(struct vfs_partition *p) { struct vfs_partition *n = (struct vfs_partition *)zalloc(sizeof(*n)); if (n) { p->next = n; } return n; } static inline void vfs_partition_free(struct vfs_partition *p) { struct vfs_partition *n = p->next; while (n) { p = n->next; free(n); n = p; } } /// \endcond /** * @brief 挂载设备虚拟文件系统 * * @param dev_name 设备名称 * @param path 挂载点路径 * @param fs_type 文件系统类型(支持"fat" "devfs" "ramfs" "sdfile") * @param cache_num 文件系统缓存 * @param dev_arg 设备参数指针 * * @return 指向挂载点结构体的指针 * @return NULL 挂载失败 */ struct imount *mount(const char *dev_name, const char *path, const char *fs_type, int cache_num, void *dev_arg); /** * @brief 卸载设备虚拟文件系统 * * @param path 挂载点路径 * * @return 0: 卸载成功 * @return other: 卸载失败 */ int unmount(const char *path); /** * @brief 格式化驱动器 * * @param path 需要格式化的根目录 * @param fs_type 文件系统类型 * @param clust_size 簇大小,簇为0时默认为卡本身簇大小 * * @return 0: 格式化成功 * @return other: 格式化失败 */ int f_format(const char *path, const char *fs_type, u32 clust_size); /** * @brief 刷新文件缓存数据(一般使用在fclose后某些数据还没有及时写进SD卡,需要主动刷新一下缓存区) * * @param path 需要刷新的根目录 * * @return 0: 刷新成功 * @return other: 刷新失败 */ int f_free_cache(const char *path); /** * @brief 打开文件, 获取指向文件流的文件指针 * * @param path 文件路径 * @param mode 打开模式 * * @return 指向文件流的文件指针 * @return NULL: 打开失败 * @note fopen自动打开、创建文件夹和文件,打开模式只支持"r" "w" "w+",如需要追加写请使用"w",文件名长度超过8个字节的需要用长文件名打开 */ FILE *fopen(const char *path, const char *mode); /** * @brief 通过utf8编码打开文件,不需要进行额外的转码,获取指向文件流的文件指针 * * @param path 文件路径(utf8编码) * @param mode 打开模式 * * @return 指向文件流的文件指针 * @return NULL: 打开失败 * @note fopen自动打开、创建文件夹和文件,打开模式只支持"r" "w" "w+",如需要追加写请使用"w" * @note 小于9个字节的中文名目录和中文文件名需要额外加上\U */ FILE *fopen_by_utf8(const char *path, const char *mode); /** * @brief 从文件中读取数据 * * @param[out] buf 保存读取到的数据 * @param size 每次读取字节数 * @param count 总共读取次数 * @param file 指向文件流的文件指针 * * @return 成功读取到的数据的字节长度 */ int fread(void *buf, u32 size, u32 count, FILE *file); /** * @brief 写入数据到文件中 * @param[in] buf 需要写入的数据 * @param size 每次写入字节数 * @param count 总共写入次数 * @param file 指向文件流的文件指针 * * @return 成功写入的数据的字节长度 */ int fwrite(void *buf, u32 size, u32 count, FILE *file); /** * @brief 设置文件指针的位置 * * @param file 指向文件流的文件指针 * @param offset 偏移量 * @param orig 偏移的基准位置 * * @return 成功返回0 */ int fseek(FILE *file, int offset, int orig); /** * @brief 快速设置文件指针的位置 * * @param file 指向文件流的文件指针 * @param offset 偏移量 * @param orig 偏移的基准位置 * @note 一般手表case使用,去除互斥,设置ram里面跑 * @return 成功返回0 */ int fseek_fast(FILE *file, int offset, int orig); /** * @brief 从文件中快速读取数据 * * @param[out] buf 保存读取到的数据 * @param size 每次读取字节数 * @param count 总共读取次数 * @param file 指向文件流的文件指针 * @note 一般手表case使用,去除互斥,设置ram里面跑 * @return 成功读取到的数据的字节长度 */ int fread_fast(void *buf, u32 size, u32 count, FILE *file); /** * @brief 获取文件的大小 * * @param file 指向文件流的文件指针 * * @return 文件大小(负值表示获取失败) */ int flen(FILE *file); /** * @brief 获取文件指针的当前位置 * * @param file 指向文件流的文件指针 * * @return 文件指针的位置 */ int ftell(FILE *file); /** * @brief 获取文件名(不包含目录) * * @param file 指向文件流的文件指针 * @param name 保存文件名的buffer,获取长文件名时buffer大小要大于长文件名长度,否则会获取到文件的短文件名"LFN~xxx",打印长文件名用put_buf方式 * @param len buffer的长度,大于15个字节获取的是长文件名,小于16个字节获取的是短文件名 * * @return 文件名的长度(大于0) */ int fget_name(FILE *file, u8 *name, int len); /** * @brief 重命名文件 * * @param file 指向文件流的文件指针 * @param path 文件的新文件名,不需要加目录路径 * * @return 0: 成功 * @return other: 失败 * @note 操作完毕后需要调用fclose关闭文件句柄 */ int frename(FILE *file, const char *fname); /** * @brief 关闭文件流 * * @param file 指向文件流的文件指针 * * @return 0: 关闭成功 */ int fclose(FILE *file); /** * @brief 删除文件,操作成功后会自动关闭文件 * * @param file 指向文件流的文件指针 * * @return 0: 删除成功 * @return other: 删除失败 */ int fdelete(FILE *file); /** * @brief 根据文件路径删除文件 * * @param fname 文件路径 * * @return 0: 删除成功 * @return other: 删除失败 */ int fdelete_by_name(const char *fname); /** * @brief 删除文件夹 * * @param path 文件夹路径,最后不需要加'/' * * @return 0: 删除成功 * @return other: 删除失败 */ int fdelete_dir(const char *path); /** * @brief 获取目录下文件总大小 * * @param path 文件夹路径,最后不需要加'/' * * @return 目录下文件总大小(用s64类型接收返回值,使用%lld打印数值) * @return 负值获取失败 */ long long flen_dir(const char *path); /** * @brief 获取剩余空间 * * @param path 设备路径 * @param space 保存剩余空间的大小 * * @return 0: 获取成功 * @return other: 获取失败 */ int fget_free_space(const char *path, u32 *space); /** * @brief 获取存储设备的物理总空间(注意是物理大小,并不是分区的逻辑空间大小) * * @param path 根目录 * @param space 保存总空间的大小 * * @return 0: 获取成功 * @return other: 获取失败 */ int fget_physical_total_space(const char *path, u32 *space); /** * @brief 获取当前文件相对路径和绝对路径 * * @param file 指向文件流的文件指针 * @param fscan 文件扫描结构体句柄 * @param name 保存文件路径的buffer * @param len buffer的长度 * @param is_relative_path 是否要获取相对路径 * * @return 文件名的长度(大于0) */ int fget_path(FILE *file, struct vfscan *fscan, u8 *name, int len, u8 is_relative_path); /** * @brief 文件扫描 * * @param path 扫描路径 * @param arg 扫描参数设置 * @param max_deepth 扫描目录层数,最大为9 * * @return 虚拟文件扫描结构体句柄 * @return NULL: 扫描失败 * @note arg扫描参数 * 1. -t 文件类型 * 2. -r 包含子目录 * 3. -d 扫描文件夹 * 4. -a 文件属性 r: 读, /: 非 * 5. -s 排序方式, t:按时间排序, n:按文件号排序 */ struct vfscan *fscan(const char *path, const char *arg, u8 max_deepth); /** * @brief 可打断的文件扫描 * * @param path 扫描路径 * @param arg 扫描参数设置 * @param max_deepth 扫描目录层数,最大为9 * @param callback 每扫描完一个目录后回调一次 * * @return 虚拟文件扫描结构体句柄 * @return NULL: 扫描失败 * @note arg扫描参数 * 1. -t 文件类型 * 2. -r 包含子目录 * 3. -d 扫描文件夹 * 4. -a 文件属性 r: 读, /: 非 * 5. -s 排序方式, t:按时间排序, n:按文件号排序 */ struct vfscan *fscan_interrupt(const char *path, const char *arg, u8 max_deepth, int (*callback)(void)); /** * @brief 文件扫描(进入指定子目录,只扫此目录下文件信息) * * @param fs 文件扫描结构体句柄 * @param path 指定目录的相对路径 * * @return 虚拟文件扫描结构体句柄 * @return NULL: 扫描失败 */ struct vfscan *fscan_enterdir(struct vfscan *fs, const char *path); /** * @brief 返回上一层的文件扫描目录 * * @param fs 文件扫描结构体句柄 * * @return 虚拟文件扫描结构体句柄 * @return NULL: 扫描失败 */ struct vfscan *fscan_exitdir(struct vfscan *fs); /** * @brief 释放文件扫描结构体句柄 * * @param fs 文件扫描结构体句柄 */ void fscan_release(struct vfscan *fs); /** * @brief 选择文件 * * @param fs 文件扫描结构体句柄 * @param selt_mode 选择模式(支持按簇号、序号、路径选择) * @param arg 选择参数,默认0 * * @return 指向文件流的文件指针 * @return NULL: 选择操作失败 */ FILE *fselect(struct vfscan *fs, int selt_mode, int arg); /** * @brief 检查挂载点是否存在 * * @param dir 挂载点路径 * * @return 1: 存在 * @return 0: 不存在 */ int fmount_exist(const char *mount_path); /** * @brief 检查目录是否存在 * * @param dir 目录路径 * * @return 1: 存在 * @return 0: 不存在 * @note 小于9个字节的中文名目录需要额外加上\U */ int fdir_exist(const char *dir); /** * @brief 获取文件的文件属性 * * @param file 指向文件流的文件指针 * @param attr 保存操作成功后文件的文件属性信息 * * @return 0: 获取成功 * @return other: 获取失败 */ int fget_attr(FILE *file, int *attr); /** * @brief 设置文件的文件属性 * * @param file 指向文件流的文件指针 * @param attr 文件属性码 * * @return 0: 设置成功 * @return other: 设置失败 */ int fset_attr(FILE *file, int attr); /** * @brief 获取文件的详细信息如属性、簇号、大小等 * * @param file 指向文件流的文件指针 * @param attr 保存操作成功后文件的详细信息 * * @return 0: 获取成功 * @return other: 获取失败 */ int fget_attrs(FILE *file, struct vfs_attr *attr); /** * @brief 获取路径对应的分区 * * @param path 分区路径 * * @return 指向分区结构体的指针 * @return NULL: 获取失败 */ struct vfs_partition *fget_partition(const char *path); /** * @brief 设置路径对应的卷标的名称 * * @param path 卷标路径 * @param name 卷标名称 * * @return 0: 设置成功 * @return other: 设置失败 */ int fset_vol(const char *path, const char *name); /** * @brief 移动文件 * * @param file 指向文件流的文件指针 * @param path_dst 目标路径,注意如果不需要更改原文件名,路径不需要填写文件名,如/aa/即可,根目录前面不能加分区路径 * @param newFile 保存操作成功后文件在新路径的文件流指针 * @param clr_attr 是否清除原有文件的文件属性 * @param path_len 目标路径长度 * * @return 0: 移动成功(自动关闭旧文件流) * @return other: 移动失败 */ int fmove(FILE *file, const char *path_dst, FILE **newFile, int clr_attr, int path_len); /** * @brief 检查文件 * * @param file 指向文件流的文件指针 * * @return 文件错误码 */ int fcheck(FILE *file);//暂不支持 /** * @brief 获取文件系统的错误代码 * * @param path 文件路径 * * @return 文件错误码 */ int fget_err_code(const char *path);//暂不支持 /** * @brief 拼接文件名(目录+文件名) (特别用于中文名文件的路径拼接) * * @param result 保存操作成功后的文件路径的字符串 * @param path 目录路径 * @param fname 文件名 * @param len fname的长度 * @param is_dir 拼接的是否为文件夹 * @param is_dir 拼接的是否为长文件名 * * @return 文件名的长度(大于0) */ int fname_to_path(char *result, const char *path, const char *fname, int len, u8 is_dir, u8 is_lfn); /* --------------------------------------------------------------------------*/ /** * @brief 获取文件夹信息,获取文件夹序号和文件夹内文件数目 * * @param fs vfscan 结构句柄 * @param arg 文件夹信息结构句柄 * * @return 0成功, 非0错误。 */ /* ----------------------------------------------------------------------------*/ int fget_folder(struct vfscan *fs, struct ffolder *arg); /* --------------------------------------------------------------------------*/ /** * @brief 设置长文件名Buf (现已不常用) * * @param fs vfscan 句柄 * @param arg buf * * @return 0成功, 非0错误。 */ /* ----------------------------------------------------------------------------*/ int fset_lfn_buf(struct vfscan *fs, void *arg); /* --------------------------------------------------------------------------*/ /** * @brief 设置长文件夹名Buf (现已不常用) * * @param fs vfscan 句柄 * @param arg buf * * @return 0成功, 非0错误。 */ /* ----------------------------------------------------------------------------*/ int fset_ldn_buf(struct vfscan *fs, void *arg); /* --------------------------------------------------------------------------*/ /** * @brief 设置后缀名过滤(现已不常用) * * @param path 根路径 * @param ext_type 后缀名 * * @return 0成功, 非0错误。 */ /* ----------------------------------------------------------------------------*/ int fset_ext_type(const char *path, void *ext_type); /* --------------------------------------------------------------------------*/ /** * @brief 文件浏览使用,打开目录 * * @param path 路径 * @param pp_file 文件句柄 * @param dir_dj 目录信息句柄 * * @return 无意义 */ /* ----------------------------------------------------------------------------*/ int fopen_dir_info(const char *path, FILE **pp_file, void *dir_dj); /* --------------------------------------------------------------------------*/ /** * @brief 文件浏览使用,进入目录 * * @param file 文件句柄 * @param dir_dj 目录信息句柄 * * @return 目录项总数 */ /* ----------------------------------------------------------------------------*/ int fenter_dir_info(FILE *file, void *dir_dj); /* --------------------------------------------------------------------------*/ /** * @brief 文件浏览使用,退出目录 * * @param file 文件句柄 * * @return 目录项总数 */ /* ----------------------------------------------------------------------------*/ int fexit_dir_info(FILE *file); /* --------------------------------------------------------------------------*/ /** * @brief 文件浏览使用,获取目录信息 * * @param file 文件句柄 * @param start_num 起始位置 * @param total_num 获取目录个数 * @param buf_info 目录信息句柄 * * @return 获取的目录数 */ /* ----------------------------------------------------------------------------*/ int fget_dir_info(FILE *file, u32 start_num, u32 total_num, void *buf_info); /* --------------------------------------------------------------------------*/ /** * @brief 存储文件簇信息 * * @param file 文件句柄 * * @note 一般手表case使用, 用于fget_fat_outflash_addr()之前调用,节省fget_fat_outflash_addr()时间 * @return 0成功, 非0错误。 */ /* ----------------------------------------------------------------------------*/ int fstore_clust_rang(FILE *file); /* --------------------------------------------------------------------------*/ /** * @brief 获取外置flash实际物理地址 * * @param file 文件句柄 * @param name sdfile格式文件名 * @param buf_info 存储相关信息结构buf指针 * @param buf_len buf 长度 * * @note 一般手表case使用 * @return 0表示buf不够 大于 0 表示存储多少个信息结构,其他 错误 */ /* ----------------------------------------------------------------------------*/ int fget_fat_outflash_addr(FILE *file, char *name, void *buf_info, int buf_len); /* --------------------------------------------------------------------------*/ /** * @brief 文件浏览使用,由歌曲名称获取歌词 * * @param file 歌曲文件句柄 * @param newFile 歌词文件句柄 * @param ext_name 后缀名称 * * @return 0成功, 非0错误。 */ /* ----------------------------------------------------------------------------*/ int fget_file_byname_indir(FILE *file, FILE **newFile, void *ext_name); /* --------------------------------------------------------------------------*/ /** * @brief 获取长文件名和长文件夹名信息(现在不常使用) * * @param file 歌曲文件句柄 * @param arg 长文件相关信息结构指针 * * @note 需要先设置长文件名或者长文件夹名buf进去 * @return 0成功, 非0错误。 */ /* ----------------------------------------------------------------------------*/ int fget_disp_info(FILE *file, void *arg); /* --------------------------------------------------------------------------*/ /** * @brief 创建目录 * * @param path 路径 * @param folder 文件夹名称,需要 /, 例如 /test * @param mode 目录属性(1 设置为隐藏属性, 0 不设置 ) * * @return 0成功,非0不成功 */ /* ----------------------------------------------------------------------------*/ int fmk_dir(const char *path, char *folder, u8 mode); /* --------------------------------------------------------------------------*/ /** * @brief 获取录音文件信息(现在不常用) * * @param path 路径 * @param folder 文件夹名称 * @param ext 文件名后缀 * @param last_num 可变数字最大数字 * @param total_num 文件总数 * * @return 0成功,非0不成功 */ /* ----------------------------------------------------------------------------*/ int fget_encfolder_info(const char *path, char *folder, char *ext, u32 *last_num, u32 *total_num); /* --------------------------------------------------------------------------*/ /** * @brief 截取path中根目录之后的文件名 * * @param path 路径 * * @return 文件名 */ /* ----------------------------------------------------------------------------*/ const char *fname_after_root(const char *path); /* --------------------------------------------------------------------------*/ /** * @brief 获取文件系统类型 * * @param path 路径 * * @return 文件系统类型 */ /* ----------------------------------------------------------------------------*/ const char *fget_fs_type(const char *path); /* --------------------------------------------------------------------------*/ /** * @brief 判断文件路径是否带有unicode编码 * * @param path 路径 * @param len 路径长度 * * @return 是否带unicode */ /* ----------------------------------------------------------------------------*/ int fget_name_type(char *path, int len); /* --------------------------------------------------------------------------*/ /** * @brief 录音获取最后序号 * * @return 最后序号 */ /* ----------------------------------------------------------------------------*/ int get_last_num(void); /* --------------------------------------------------------------------------*/ /** * @brief 设置断点参数 * * @param clust 记录的簇号 * @param fsize 记录的文件大小 * @param flag 文件是否存在标志 * * @note 1.接口调用在扫描前 * 2.使用完需要put_bp_info对应释放buf */ /* ----------------------------------------------------------------------------*/ void set_bp_info(u32 clust, u32 fsize, u32 *flag); /* --------------------------------------------------------------------------*/ /** * @brief 释放内存 */ /* ----------------------------------------------------------------------------*/ void put_bp_info(void); /* --------------------------------------------------------------------------*/ /** * @brief 优化扫盘速度,优化文件打开速度,如果不需要切换文件夹的操作,可置0关闭 * * @param enable 开关 * @note 1.目的是是否去除获取文件夹内所有文件功能,默认enable 是1 获取数目,置0不获取,所以不需要切换文件夹操作的功能,可置0 关闭 * 2.在扫描前调用接口 */ /* ----------------------------------------------------------------------------*/ void ff_set_FileInDir_enable(u8 enable); /* --------------------------------------------------------------------------*/ /** * @brief 设置目录项基点信息(用于加速) * * @param buf 存储基点buf (长度 10 * n) * @param n 基点数目 * @note 1.加速序号选择文件,明显效果体现在上一曲加速 * 2.注意buf使用 */ /* ----------------------------------------------------------------------------*/ void ff_set_DirBaseInfo(void *buf, u16 n); /* --------------------------------------------------------------------------*/ /** * @brief 设置文件的创建时间 * * @param year 年 * @param month 月 * @param day 日 * @param hour 小时 * @param minute 分钟 * @param second 秒 */ /* ----------------------------------------------------------------------------*/ void fat_set_datetime_info(u16 year, u8 month, u8 day, u8 hour, u8 minute, u8 second); /* --------------------------------------------------------------------------*/ /** * @brief 隐藏属性文件是否过滤 * * @param flag 置1 为过滤 */ /* ----------------------------------------------------------------------------*/ void hidden_file(u8 flag); /* --------------------------------------------------------------------------*/ /** * @brief 是否保存预申请长度 * * @param enable 1保存,0 不保存 */ /* ----------------------------------------------------------------------------*/ void fat_save_already_size_enable(char enable); /* --------------------------------------------------------------------------*/ /** * @brief 设置预申请簇数目 * * @param num 数目(1-0x1fe) */ /* ----------------------------------------------------------------------------*/ void fat_set_pre_create_chain_num(u16 num); /* --------------------------------------------------------------------------*/ /** * @brief 存储文件簇信息 * * @param file 文件句柄 * @param btr buf 长度 * @param buf buf指针 * * @note seek加速,4字节对齐 * @return 0成功,非0不成功 */ /* ----------------------------------------------------------------------------*/ int fsave_fat_table(FILE *file, u16 btr, u8 *buf); /* --------------------------------------------------------------------------*/ /** * @brief 刷新文件系统缓存buf * * @param path 设备路径 * * @return 0成功,非0不成功 */ /* ----------------------------------------------------------------------------*/ int f_flush_wbuf(const char *path); /* --------------------------------------------------------------------------*/ /** * @brief 插入文件,操作的两个文件指针都需要用只读r方式打开,而且文件大小需要对齐簇大小,否则会出现前后数据丢失的情况 * * @param file 源文件 * @param i_file 需要插入的文件 * @param fptr 源文件被插入的位置 * * @return 0成功,非0不成功 * @note 操作完毕后需要调用fclose关闭文件句柄 */ /* ----------------------------------------------------------------------------*/ int finsert_file(FILE *file, FILE *i_file, u32 fptr); /* --------------------------------------------------------------------------*/ /** * @brief 分割文件,操作的文件指针需要用只读r方式打开,而且文件大小需要对齐簇大小,否则会出现前后数据丢失的情况 * * @param file 源文件 * @param file_name 分割后第二个文件文件名 * @param fptr 源文件被分割位置 * * @return 0成功,非0不成功 * @note 操作完毕后需要调用fclose关闭文件句柄 */ /* ----------------------------------------------------------------------------*/ int fdicvision_file(FILE *file, char *file_name, u32 fptr); #endif /* __FS_H__ */