创建
/**
* @brief 创建文件:在密码设备内部创建用于存储用户数据的文件
* @param pucFileName 缓冲区指针,用于存放输入的文件名,最大长度128字节
* @param uiNameLen 文件名长度
* @param uiFileSize 文件所占存储空间的长度
*/
void CreateFile(sdf_uint8_t *pucFileName, sdf_uint32_t uiNameLen,
sdf_uint32_t uiFileSize) override {
std::string file_name{reinterpret_cast<const char *>(pucFileName),uiNameLen};
file_name = mgmt::get_md5_digest(file_name);
int fd = open(file_name.c_str(),O_RDWR | O_CREAT );
// TODO: error code, open error
if (fd == -1){
ERR_EXIT("open error");
}
int ret = lseek(fd,uiFileSize,SEEK_CUR);
// TODO: error code, leek error
if (ret == -1){
ERR_EXIT("leek error");
}
close(fd);
}
读入
/**
* @brief 读取文件:读取密码设备内部存储的用户数据文件的内容
* @param pucFileName 缓冲区指针,用于存放输入的文件名,最大长度128字节
* @param uiNameLen 文件名长度
* @param uiOffset 指定读取文件时的偏移值
* @param puiReadLength 入参时指定读取文件内容的长度;出参时返回实际读取文件内容的长度
* @param pucBuffer 缓冲区指针,用于存放读取的文件数据
*/
void ReadFile(sdf_uint8_t *pucFileName, sdf_uint32_t uiNameLen,
sdf_uint32_t uiOffset, sdf_uint32_t *puiReadLength,
sdf_uint8_t *pucBuffer) override {
std::string file_name = reinterpret_cast<const char *>(pucFileName,uiNameLen);
std::ifstream file(file_name.c_str(),std::istream::binary);
file.seekg(uiOffset,std::ios::beg);
file.read(reinterpret_cast<char *>(pucBuffer),
reinterpret_cast<long>(puiReadLength));
if (file)
std::cout << "all characters read successfully.";
else{
std::cout << "error: only " << file.gcount() << " could be read";
puiReadLength = reinterpret_cast<sdf_uint32_t *>(file.gcount());
}
file.close();
}
写入
/**
* @brief 写入文件:向密码设备内部存储用户数据的文件中写入内容
* @param pucFileName 缓冲区指针,用于存放输入的文件名,最大长度128字节
* @param uiNameLen 文件名长度
* @param uiOffset 指定写入文件时的偏移值
* @param uiWriteLength 指定写入文件内容的长度
* @param pucBuffer 缓冲区指针,用于存放输入的写文件数据
*/
void WriteFile(sdf_uint8_t *pucFileName, sdf_uint32_t uiNameLen,
sdf_uint32_t uiOffset, sdf_uint32_t uiWriteLength,
sdf_uint8_t *pucBuffer) override {
std::string file_name = reinterpret_cast<const char *>(pucFileName,uiNameLen);
std::ofstream file(file_name.c_str(),std::istream::binary);
file.seekp(uiOffset,std::ios::beg);
file.write(reinterpret_cast<const char *>(pucBuffer),uiWriteLength);
file.close();
}
删除
/**
* @brief 删除文件:删除指定文件名的密码设备内部存储用户数据的文件
* @param pucFileName 缓冲区指针,用于存放输入的文件名,最大长度128字节
* @param uiNameLen 文件名长度
*/
void DeleteFile(sdf_uint8_t *pucFileName, sdf_uint32_t uiNameLen) override {
std::string file_name{reinterpret_cast<const char *>(pucFileName),uiNameLen};
file_name = mgmt::get_md5_digest(file_name);
remove(file_name.c_str());
}
参考链接