#include <dirent.h>
#include <ctype.h>
// 函数:提取文件名中的序号
int extract_number(const char *filename) {
int number = 0;
while (*filename) {
if (isdigit(*filename)) {
number = number * 10 + (*filename - '0');
}
filename++;
}
return number;
}
// 函数:遍历文件夹并返回最大序号
int find_max_file_number(const char *dir_path) {
DIR *dir;
struct dirent *entry;
int max_number = -1;
dir = opendir(dir_path);
if (dir == NULL) {
perror("无法打开目录");
return -1;
}
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) { // 只处理普通文件
int current_number = extract_number(entry->d_name);
if (current_number > max_number) {
max_number = current_number;
}
}
}
closedir(dir);
return max_number;
}
static char jjpeg[50*1024];
static void save_jpeg(char *buf, int size)
{
TS_S32 s32Ret = 0;
char dirPath[64] = {0};
char yuvPath[64] = {0};
FILE *fd = NULL;
VIDEO_FRAME_INFO_S frame = {0};
static int count = 0;
printf("dump jpeg begin\n");
if(access("/mnt/mmc01/0/jpeg",F_OK) != 0)
mkdir("/mnt/mmc01/0/jpeg", 0777);
int max_number = find_max_file_number("/mnt/mmc01/0/jpeg");
printf("!!1!max_number=%d\n", max_number);
snprintf(dirPath, sizeof(dirPath), "/mnt/mmc01/0/jpeg/%d.jpeg", max_number+1);
fd = fopen(dirPath, "wb");
fwrite(buf, size, 1, fd);
fflush(fd);
int fd_no = fileno(fd);
fsync(fd_no);
fclose(fd);
printf("dump jpeg end\n");
return;
}
save_jpeg(jjpeg, size);
1. 头文件与函数定义
-
<dirent.h>
:用于目录操作(如打开目录、读取文件项)。 -
<ctype.h>
:提供字符处理函数(如isdigit
判断是否为数字)。
2. extract_number
函数
-
作用:从文件名中提取连续数字并转换为整数。
-
示例:
-
文件名
"photo5.jpg"
→ 提取5
。 -
文件名
"img12345.txt"
→ 提取12345
)。
-
-
注意:若文件名无数字,返回
0
。
3. find_max_file_number
函数
-
作用:遍历目录,找出文件名中数字最大的文件。
-
流程:
-
打开目录,检查是否为普通文件(
DT_REG
)。 -
对每个文件名调用
extract_number
,更新最大序号。 -
返回最大序号;若目录为空或无数字文件,返回
-1
。
-
-
注意:仅处理普通文件,忽略子目录和特殊文件。
4. save_jpeg
函数
-
作用:将 JPEG 数据保存到按序号递增的文件中。
-
流程:
-
检查目录:若
/mnt/mmc01/0/jpeg
不存在,则创建(权限0777
)。 -
获取最大序号:调用
find_max_file_number
,确定下一个序号(max_number + 1
)。 -
生成文件名:如
/mnt/mmc01/0/jpeg/6.jpeg
。 -
写入文件:将数据写入文件,并调用
fsync
确保数据持久化。
-