现在的位置: 首页 > 综合 > 正文

fatfs —— f_open() FA_CREATE_ALWAYS vs FA_CREATE_NEW 探究

2018年03月16日 ⁄ 综合 ⁄ 共 994字 ⁄ 字号 评论关闭

为什么设置为NEW,f_open返回FR_EXIST(认为"该文件存在"是种错误),改成ALWAYS 就返回OK?

fatfs在这里的思路是什么?

说明写着:

FA_CREATE_NEW   

创建一个新文件。如果文件已存在,则创建失败。
FA_CREATE_ALWAYS  

创建一个新文件。如果文件已存在,则它将被截断并覆盖。

看f_open()里的这部分:

/* Create or Open a file */
if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) {
DWORD ps, cl;

if (res != FR_OK) {/* No file, create new */
if (res == FR_NO_FILE)
res = dir_register(&dj);
if (res != FR_OK) LEAVE_FF(dj.fs, res);
mode |= FA_CREATE_ALWAYS;    //如果没文件,则创建文件,成功后自动设置为FA_CREATE_ALWAYS
dir = dj.dir;
}
else {
/* Any object is already existing */
if (mode & FA_CREATE_NEW)/* Cannot create new */
LEAVE_FF(dj.fs, FR_EXIST);   //如果有文件,且用户传来的设置选项为FA_CREATE_NEW,就报错。计算机的理解是:FA_CREATE_NEW为如果文件已存在则导致无法新建则而报错。

......

if (mode & FA_CREATE_ALWAYS) {/* Resize it to zero if needed */

......         //如果有文件,且用户传来的设置选项为FA_CREATE_ALWAYS,就“截断并覆盖”。计算机的理解是:FA_CREATE_ALWAYS为如果文件已存在则文件被清空。

}

实验:FA_CREATE_ALWAYS会不会把打开的文件清空?

实验结果:我去,还真是。

实验:如果不用FA_CREATE_ALWAYS 和 FA_CREATE_NEW呢?

实验结果:当该文件存在时,f_open()时没被更改。

所以,如果希望在没有该文件的时候创建,应该先f_open,且不设置选项FA_CREATE_NEW和FA_CREATE_ALWAYS。当返回值是FR_NO_FILE时,再f_open(FA_CREATE_NEW)。

抱歉!评论已关闭.