为什么设置为NEW,f_open返回FR_EXIST(认为"该文件存在"是种错误),改成ALWAYS 就返回OK?
fatfs在这里的思路是什么?
说明写着:
FA_CREATE_NEW
创建一个新文件。如果文件已存在,则创建失败。创建一个新文件。如果文件已存在,则它将被截断并覆盖。
看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)。