RAM 文件系统结构
-
struct filestate {
-
int flag; /**< 文件是否开启标志*/
-
#define FLAG_FILE_CLOSED 0
-
#define FLAG_FILE_OPEN 1
-
int fileptr; /**< 文件写入或读出的的位置*/
-
int filesize; /**< 文件中存储的数据长度*/
-
};
打开文件系统
-
int cfs_open(const char *n, int f)
-
{
-
if(file.flag == FLAG_FILE_CLOSED) {
-
file.flag = FLAG_FILE_OPEN;
-
if(f & CFS_READ) {
-
file.fileptr = 0; /**< 只读,从文件头部开始读*/
-
}
-
if(f & CFS_WRITE){
-
if(f & CFS_APPEND) {
-
file.fileptr = file.filesize; /**< 追加,从上次写入的位置追加*/
-
} else { /**< 只写,从头开始写*/
-
file.fileptr = 0;
-
file.filesize = 0;
-
}
-
}
-
return 1;
-
} else {
-
return -1;
-
}
-
}
文件有三种方式打开,读,写,追加;分别为CFS_READ;CFS_WRITE;CFS_WRITE | CFS_APPEND(追加)。问价打开成功返回文件描述,否则返回-1.
调用cfs_open以只读方式打开文件,则是从文件头开始读,如果想要指定读的位置需要调用cfs_seek。如果以只写的方式打开,则每次就是从头开始写,可调用
cfs_seek函数修改写的位置;追加则是从上一次的尾部开始写入数据。
关闭文件系统
-
void cfs_close(int f)
-
{
-
file.flag = FLAG_FILE_CLOSED; /**< 修改文件系统状态*/
-
}
寻找文件系统中特定位置
-
cfs_offset_t cfs_seek(int f, cfs_offset_t o, int w)
-
{
-
if(w == CFS_SEEK_SET && f == 1) {
-
if(o > file.filesize) { /**< 追寻的位置比文件系统中的数据个数多,调整追寻的位置。注意此函数智能在同一个进程中调用,因为在另一个进程中调用open会把缓存长度清0*/
-
o = file.filesize;
-
}
-
file.fileptr = o; /**< 成功返回当前的位置*/
-
return o;
-
}
-
return (cfs_offset_t)-1; /**< 失败*/
-
}
文件系统写
-
int cfs_write(int f, const void *buf, unsigned int len)
-
{
-
/**参数检查及调整写入的长度*/
-
if(file.fileptr >= sizeof(filemem)) {
-
return 0;
-
}
-
if(file.fileptr + len > sizeof(filemem)) {
-
len = sizeof(filemem) - file.fileptr;
-
}
-
-
if(file.fileptr + len > file.filesize) {
-
/* Extend the size of the file. */
-
file.filesize = file.fileptr + len;
-
}
-
-
if(f == 1) {
-
//写入,并调整下次写入的位置
-
memcpy(&filemem[file.fileptr], buf, len);
-
file.fileptr += len;
-
return len;
-
} else {
-
return -1;
-
}
-
}
文件系统读
-
int cfs_read(int f, void *buf, unsigned int len)
-
{
-
//调整读的长度
-
if(file.fileptr + len > sizeof(filemem)) {
-
len = sizeof(filemem) - file.fileptr;
-
}
-
-
if(file.fileptr + len > file.filesize) {
-
len = file.filesize - file.fileptr;
-
}
-
-
if(f == 1) {
-
//调整下次读的位置
-
memcpy(buf, &filemem[file.fileptr], len);
-
file.fileptr += len;
-
return len;
-
} else {
-
return -1;
-
}
-
}
注意:
在同一个进程中,读写不能轮询调用,因为读写使用同一指针。如果使用可以调用cfs_seek调整读写指针,进行写入或读出。另外不能再两个进程中调用只写,因为调用只写的时候,会把文件系统中的长度和写入读出指针全部清0 因此会覆盖前个进程的数据。
但两个进程可以,一个调用读,一个调用写(或追加)。
阅读(677) | 评论(0) | 转发(0) |