doubao_chat/include_lib/utils/fs/fs.h

1081 lines
32 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 __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__ */