共2条
1/1 1 跳转至页
zlg,fs 我发现zlg/fs文件系统有错误!
问
1. 删除文件函数RemoveFile()中:
(1)if (FindOpenFile(Drive, ClusterIndex, DirName) < MAX_OPEN_FILES)
{删除文件}
应该改为:
(2)if (FindOpenFile(Drive, ClusterIndex, DirName) >= MAX_OPEN_FILES)
{删除文件}
因为FindOpenFile()的返回值为打开的文件的句柄,如果(1)对,则说明文件已经打开,此时是不能删除文件的,所以我觉得应该改为(2).
2. 改变当前目录函数ChangeDir(Path)中:
有调用函数GetDirClusterIndex(pPath):
if (FindFDTInformation(&Rt, Drive, ClusIndex, DirName) != RETURN_OK)
{uiErr = BAD_CLUSTER;
break;
}
DirName是Path中的目录名,if语句中既然成立,证明能找到Path中的目录名,Path中的目录名不是现在要改的吗?怎么会存在呢?
答 1: 我一直没有看懂我很想看懂这一部分,可没有资料,没办法看懂。
看来你有什么资料,还能看出他的问题。
你是怎么看懂的,望能交流 答 2: 。1,如果磁盘里没有那个文件,怎么删除?流程可能是 : 打开文件---〉(如果文件存才) ---〉 删除文件,这里也有个问题:文件句柄如果用完,那个文件无法打开,也就不能删除,不清楚zlg fs这点有没有考虑
2,path = dirname + filename(也可能是目录),if语句的目的好像是在判断path指定的目录是否存在,如果不存在,返回。建议楼主把代码多看几遍,这点仅从这点代码无法判断fs 是否有错。测试一下,应该就知道了。。 答 3: re:lyy1981我觉得你说的不对:
1. 对于删除文件函数,有判断文件是否存在,那是对的,我说的错误是在后面判断文件是否打开,只有文件关闭才能删除,它这里是用FindOpenFile()来判断的,这个函数的返回值有二钟情况:打开的文件的句柄;没有找到打开的文件。应该为后者才能被删除啊!而书中的判断刚好反了!
2. 你说的是没错,可是不存在返回的话,这个返回值就是改变当前目录函数ChangeDir(Path)的返回值,因为在这个函数中,只有返回值不等于 BAD_CLUSTER才能改变目录啊!也就是改变逻辑盘信息中的当前目录首簇号这一项,这是改变目录的实质。
你觉得呢? 答 4: re:lyy1981你有看过或调试过这个文件系统吗?
我这是在调试中才发现的,不调试我哪看的出来啊? 答 5: re程序在《ARM嵌入式系统软件开发实例》这本书中! 答 6: 我没调过 答 7: re我改了以上2个函数后,调试都通过了!
还有,周立功文件系统读写文件很慢很慢,我写一个35K的文件都花了40S,这样肯定不行。
我把读写文件函数自己写了一下,结果很快,不到1S就好了!
看来这个文件系统还有很多问题哦! 答 8: 文件系统全部是线性查找的我也修改了查询算法
(1)if (FindOpenFile(Drive, ClusterIndex, DirName) < MAX_OPEN_FILES)
{删除文件}
应该改为:
(2)if (FindOpenFile(Drive, ClusterIndex, DirName) >= MAX_OPEN_FILES)
{删除文件}
因为FindOpenFile()的返回值为打开的文件的句柄,如果(1)对,则说明文件已经打开,此时是不能删除文件的,所以我觉得应该改为(2).
2. 改变当前目录函数ChangeDir(Path)中:
有调用函数GetDirClusterIndex(pPath):
if (FindFDTInformation(&Rt, Drive, ClusIndex, DirName) != RETURN_OK)
{uiErr = BAD_CLUSTER;
break;
}
DirName是Path中的目录名,if语句中既然成立,证明能找到Path中的目录名,Path中的目录名不是现在要改的吗?怎么会存在呢?
答 1: 我一直没有看懂我很想看懂这一部分,可没有资料,没办法看懂。
看来你有什么资料,还能看出他的问题。
你是怎么看懂的,望能交流 答 2: 。1,如果磁盘里没有那个文件,怎么删除?流程可能是 : 打开文件---〉(如果文件存才) ---〉 删除文件,这里也有个问题:文件句柄如果用完,那个文件无法打开,也就不能删除,不清楚zlg fs这点有没有考虑
2,path = dirname + filename(也可能是目录),if语句的目的好像是在判断path指定的目录是否存在,如果不存在,返回。建议楼主把代码多看几遍,这点仅从这点代码无法判断fs 是否有错。测试一下,应该就知道了。。 答 3: re:lyy1981我觉得你说的不对:
1. 对于删除文件函数,有判断文件是否存在,那是对的,我说的错误是在后面判断文件是否打开,只有文件关闭才能删除,它这里是用FindOpenFile()来判断的,这个函数的返回值有二钟情况:打开的文件的句柄;没有找到打开的文件。应该为后者才能被删除啊!而书中的判断刚好反了!
2. 你说的是没错,可是不存在返回的话,这个返回值就是改变当前目录函数ChangeDir(Path)的返回值,因为在这个函数中,只有返回值不等于 BAD_CLUSTER才能改变目录啊!也就是改变逻辑盘信息中的当前目录首簇号这一项,这是改变目录的实质。
你觉得呢? 答 4: re:lyy1981你有看过或调试过这个文件系统吗?
我这是在调试中才发现的,不调试我哪看的出来啊? 答 5: re程序在《ARM嵌入式系统软件开发实例》这本书中! 答 6: 我没调过 答 7: re我改了以上2个函数后,调试都通过了!
还有,周立功文件系统读写文件很慢很慢,我写一个35K的文件都花了40S,这样肯定不行。
我把读写文件函数自己写了一下,结果很快,不到1S就好了!
看来这个文件系统还有很多问题哦! 答 8: 文件系统全部是线性查找的我也修改了查询算法
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |