fatfs —— f_open() FA_CREATE_ALWAYS vs FA_CREATE_NEW 探究

来源:互联网 发布:办公主要软件 编辑:程序博客网 时间:2024/05/29 19:00

为什么设置为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)。

0 0