嵌入式技术william hill官网
直播中

麻酱

8年用户 1250经验值
擅长:MEMS/传感技术
私信 关注
[问答]

为什么用DFS创建文件会失败呢?

2.jpg

显示已经关闭成功了,为什么还是没有申请到新的fd.

3.jpg

代码:

int Write2SD(char C_data)
{
static int can_filecount = 00000001;//定义一个静态变量用来新建存储can数据的文件。
static int can_datacount = 0;//用来记录一个文件里面的帧数
static uint8_t Creatfile= 1;//用来表示是否需要创建文件
static uint8_t Creatdir = 1;//用来表示是否需要创建文件夹
static int fd = 0;
int res_sync;
int res_write;
int res_close;
//这个函数只负责新建文件夹和新建文件存储数据。
//创建文件夹
if(Creatdir == 1)
{
int res_mk;
res_mk = mkdir("/can_data01",0x777);//创建了can_data01文件夹
if (res_mk < 0)
{
/
创建目录失败 */
rt_kprintf("dir error!\n");
}
else {
//创建成功,下次进来之后就不再创建;
Creatdir = 0;
}
}
if(Creatfile == 1)
{
char name[50] = "/can_data01/can";
char file_type[] = ".csv";
char count2char[10];
count2char[0] = '\0';
sprintf(count2char,"%d",can_filecount);
strcat(name,count2char);
strcat(name,file_type);
opendir("/can_data01");
fd = open(name, O_CREAT|O_WRONLY);//如果文件不存在则创建一个文件
if(fd>0)
{
Creatfile = 0;//创建成功以后,再次进入函数不再创建文件。
}
else {
rt_kprintf("create file failed\r\n");
}
}
if(fd>0)
{
// rt_kprintf("C_data:%s\r\n",C_data);
res_write = write(fd, C_data, strlen(C_data));
if(res_write >0)
{
;
// rt_kprintf("res_write = %d\r\n",res_write);
}
else
{
rt_kprintf("write error%d \r\n",strlen(C_data));
rt_kprintf("write error \r\n");
}
lseek(fd,0, SEEK_CUR);
res_sync = fsync(fd);//同步,将缓存写到SD卡里面。
can_datacount++;
if(can_datacount>100)
{
can_datacount = 0;//清零计数器
Creatfile = 1;//下次进入函数要创建新文件
can_filecount++;//新建文件的编号
res_close = close(fd);//写完一个文件一定要关闭;
if(res_close == 0)
{
rt_kprintf("close successed:%d\r\n",res_close);
}
else {
rt_kprintf("close failed:%d\r\n",res_close);
}
rt_kprintf("file count:%d,fd = %d\r\n",can_filecount-1,fd);
}
if(res_sync == 0)
{
;
}
else {
rt_kprintf("res_sync failed:%d",res_sync);
}
}
}

回帖(3)

李平

2023-1-11 14:25:37
这边建议使用 dfs_open dfs_close api 测试一下。

opendir(“/can_data01”);

这句干嘛的,没用吧。打开文件不需要打开 dir。打开 dir 又没有close dir
举报

麻酱

2023-1-11 14:25:49
感谢,已经发现了,没有关闭目录,刚接触。非常感谢
举报

麻酱

2023-1-11 14:25:56
一般关于这个错误基本是内存泄漏,我明明已经关闭了文件为什么还会出错。
因为我在每次创建文件之前都会打开文件夹。但是却没有关闭文件夹导致的。

一个非常低级的错误。因为写代码不仔细,和刚接触。其实看类型也可以看出来内存资源全部是被dir占用的。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分