// // Created by misaki on 2025/9/9. // /** * 本模块用于管理SD卡文件 * 同样为单例类 * 支持异步读取和写入 */ #pragma once #include #include #include #include #include "ThreadManager.h" #include "SD_MMC.h" class SDFileManager { public: // 文件操作回调函数类型定义 using WriteCallback = std::function; using ReadCallback = std::function; using ListCallback = std::function& files)>; using OpenCallback = std::function; static SDFileManager* getInstance(); // 同步文件操作 /** * 同步写入文件 * @param path 文件路径 * @param data 数据 * @return 是否成功 */ bool writeFileSync(const char* path, const char* data); /** * 同步读取文件 * @param path 文件路径 * @return 文件内容 */ std::string readFileSync(const char* path); /** * 同步列出目录下的文件 * @param directory 目录路径 * @param extension 文件扩展名 * @return 文件列表 */ std::vector listFilesSync(const char* directory, const char* extension = nullptr); /** * 同步打开文件 * @param path 文件路径 * @param mode 模式 * @return 文件指针 */ FILE* openFileSync(const char* path, const char* mode = "rb"); /** * 同步关闭文件 * @param file 文件指针 * @return 是否成功 */ bool closeFileSync(FILE* file); // 异步文件操作 /** * 异步写入文件 * @param path 文件路径 * @param data 数据 * @param callback 回调函数 */ void asyncWriteFile(const char* path, const char* data, WriteCallback callback = nullptr); /** * 异步读取文件 * @param path 文件路径 * @param callback 回调函数 */ void asyncReadFile(const char* path, ReadCallback callback = nullptr); /** * 异步列出目录下的文件 * @param directory 目录路径 * @param extension 文件扩展名 * @param callback 回调函数 */ void asyncListFiles(const char* directory, const char* extension, ListCallback callback = nullptr); /** * 异步打开文件 * @param path 文件路径 * @param mode 模式 * @param callback 回调函数 */ void asyncOpenFile(const char* path, const char* mode, OpenCallback callback = nullptr); /** * 类似Linux的ls命令,列出目录内容 * @param path 目录路径 * @param recursive 是否递归列出子目录 * @param showDetails 是否显示详细信息(大小、类型等) * @return 格式化后的目录列表字符串 */ std::string lsCommand(const char* path, bool recursive = false, bool showDetails = false); /** * 类似Linux的cat命令,显示文件内容 * @param path 文件路径 * @param lineNumbers 是否显示行号 * @return 文件内容字符串 */ std::string catCommand(const char* path, bool lineNumbers = false); /** * 类似Linux的pwd命令,获取当前工作目录 * @return 当前工作目录 */ std::string pwdCommand(); /** * 类似Linux的cd命令,改变当前工作目录 * @param path 目标目录路径 * @return 是否成功 */ bool cdCommand(const char* path); /** * 类似Linux的mkdir命令,创建目录 * @param path 目录路径 * @return 是否成功 */ bool mkdirCommand(const char* path); /** * 类似Linux的rm命令,删除文件或目录 * @param path 文件或目录路径 * @param recursive 是否递归删除目录 * @return 是否成功 */ bool rmCommand(const char* path, bool recursive = false); /** * 类似Linux的stat命令,获取文件/目录信息 * @param path 文件或目录路径 * @return 文件信息字符串 */ std::string statCommand(const char* path); // 获取SD卡和Flash信息 uint32_t getSDCardSize() const { return SDCard_Size; } uint32_t getFlashSize() const { return Flash_Size; } private: explicit SDFileManager(); // 私有构造函数,确保单例 ~SDFileManager(); SDFileManager(SDFileManager const&) = delete; // 禁止拷贝构造 SDFileManager& operator=(SDFileManager const&) = delete; // 禁止赋值构造 // 初始化SD卡 void init(); // 辅助方法 std::string getFileInfoString(const char* path, const struct stat* st); std::string getFileTypeString(mode_t mode); std::string formatFileSize(size_t size); bool removeDirectoryRecursive(const char* path); // 线程配置 ThreadConfig getThreadConfig(const char* operation); private: static SDFileManager* SDFileInstance; // 单例实例 static std::mutex instance_mutex; // 实例互斥锁 std::mutex file_operation_mutex; // 文件操作互斥锁 bool is_initialized; // SD卡初始化状态 std::string current_directory; // 当前工作目录 };