📄 _fs_fopen.c
字号:
/*----------------------------------------------------------------------------
* R T L - F l a s h F i l e S y s t e m
*----------------------------------------------------------------------------
* Name: _FS_FOPEN.C
* Purpose: Low level File Open Function
* Rev.: V3.22
*----------------------------------------------------------------------------
* This code is part of the RealView Run-Time Library.
* Copyright (c) 2004-2008 KEIL - An ARM Company. All rights reserved.
*---------------------------------------------------------------------------*/
#include <stdio.h>
#include <rt_sys.h>
#include <rt_misc.h>
#include "File_Config.h"
/*--------------------------- __fopen ---------------------------------------*/
int __fopen (const char *fname, int openmode) {
/* Low level file open function. */
U32 i,fid;
int handle;
IOB *fcb;
/* Find unused _iob[] structure. */
if ((handle = fs_find_iob ()) == EOF) {
/* Cannot find any unused _iob[] structure */
return (-1);
}
fcb = &_iob[handle];
fcb->drive = fs_get_drive (fname);
if (fcb->drive != DRV_NONE) {
/* Skip drive letter 'X:' */
fname += 2;
}
else {
fcb->drive = _DEF_DRIVE;
}
if (openmode & OPEN_PLUS) {
/* File mode "rw" is currently not supported. */
goto err;
}
fcb->flags = (openmode & (OPEN_W | OPEN_A)) ? _IOWRT : _IOREAD;
if (openmode & OPEN_A) {
fcb->flags |= _IOAPPEND;
}
if (fcb->drive == DRV_MCARD) {
/* Open a file on Flash Memory Card. */
fid = (fat_find_file (fname, fcb) == __TRUE) ? 0 : 1;
}
else {
/* Open a file on Embedded Flash/RAM device. */
if (fs_set_params (fcb) == __FALSE) {
goto err;
}
fcb->_fidx = 0;
fid = fs_Find_File (fname, fcb);
}
if (fid == 0) {
/* File with a given 'fname' has been found */
for (i = 0; i < _NFILE; i++) {
if (i == handle) {
continue;
}
if (_iob[i].flags & (_IOREAD|_IOWRT)) {
if ((_iob[i].fileID == fcb->fileID) &&
(_iob[i]._currDatClus == fcb->_currDatClus)) {
/* This file is already opened. */
if ((_iob[i].flags & _IOWRT) || (fcb->flags & _IOWRT)) {
/* Only multiple fopen for read is allowed. */
goto err;
}
}
}
}
if (fcb->flags & _IOAPPEND) {
/* Append mode, done here, block appended by _setfpos(). */
fcb->fsize = __getfsize (fcb, __TRUE);
return (handle);
}
if (fcb->drive == DRV_MCARD) {
/* Open a file on Flash Memory Card. */
if (fcb->flags & _IOWRT) {
fat_delete (fname, fcb);
goto mcard;
}
}
else {
/* Open a file on embedded Flash/RAM Device. */
if (fcb->flags & _IOWRT) {
_fdelete (fcb);
goto fdev;
}
/* Open also 0-size file for reading. */
fcb->_ftop = fcb->_fbot;
}
return (handle);
}
/* File not found */
if (fcb->flags & _IOREAD) {
err: fcb->flags = 0;
return (-1);
}
if (fcb->drive == DRV_MCARD) {
mcard:if (fat_create (fname, fcb) == __FALSE) {
goto err;
}
}
else {
/* The max. 'fid' found in previous 'fs_Find_File' is here. */
fcb->fileID = fs_get_freeID (fid, fcb);
fdev: if (_fcreate (fname, fcb) != 0) {
goto err;
}
}
return (handle);
}
/*----------------------------------------------------------------------------
* end of file
*---------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -