io 部分主要是对于输入输出的操作
这几段代码中也只是一些相对简单的操作
【CFileList.h/cpp】
CFileList 类实现了 IFileList 接口
用于列举某个目录下的所有文件并可以判断某个文件是否位目录,以进行递归搜索
类的内部定义了一个结构体 FileEntry 保存文件的信息 —— 包括 "文件名" "文件大小" "是否位目录"
并声明了一个数组来保存当前目录下所有文件的信息
只有构造函数稍微有些料,其他部分都很简单
构造函数中对当前路径下所有文件进行搜索并获取相关的信息加入到列表中
0.1 中只有 Win32 的版本,使用了 _findfirst / _findnext 来搜索当前目录下的文件信息
如果需要跨平台的话还要实现其它平台的版本
【CReadFile.h/cpp】
用于对文件的读取操作
使用标准库函数可以比较容易的实现跨平台的操作
/ 贴士 buff 开启 /
【关于系统调用和标准库函数的效率】
因为博主上的大学比较重视 Linux,所以从入学就被老师半强迫式地使用 Linux
大三下学期,老师更是要我们编程尽量使用 Linux 系统调用,能使用 open 就不要使用 fopen
其中很重要的一条理由就是速度快,库函数内部的实现也是通过系统调用
但是速度也和使用情景有关系,如果只是偶然打开一下文件,库函数要更快速
如果是在频繁打开文件读写的情况下,库函数的速度会比系统函数更快
因为库函数会在内存中开辟缓存区来避免频繁的 IO 操作
而且对于跨平台编程来说,使用标准库函数也是很好的习惯
( 博主知识有限,如果有没有考虑到的地方,大家多提意见吧 ヽ(o_ _)o )
/ 贴士 buff 结束 /
【获取文件的大小】
linux 中可以使用 stat 获取文件的信息,当然,也包括大小
Windows 中也有API名曰 GetFileSize() 可以直接获取文件大小
在源码中使用了一个更加通用的方式
首先打开文件,将文件读取指针定位到文件末尾,然后获取文件读取指针的位置,最后恢复文件读取指针的位置
全部使用标准库函数就可以实现获取文件大小的操作
【CMemoryReadFile.h/cpp】
依然继承自 IReadFIle , 实现了像从磁盘中读取文件一样的读取内存中的数据
这样做可以屏蔽掉读取内存数据和读取磁盘数据的区别,也可以很方便的转换读取的方式
代码的实现都很简单,都是基本的内存的操作
只是有一个地方有点奇怪,不知道是不是有意这样的
就是在 CMemoryReadFile::read() 中计算 amount,下面贴出代码,添加了注释的那一行
//! returns how much was read
size_t CMemoryReadFile::read(void* buffer, size_t sizeToRead)
{
size_t amount = sizeToRead;
if (Pos + amount > Len)
amount -= Pos + amount - Len; // 为什么不直接 amount = Len - Pos;
if (amount < 0)
amount = 0;
c8* p = (c8*)Buffer;
memcpy(buffer, p + Pos, amount);
Pos += static_cast<u32> ( amount );
return amount;
}
没活干的生活,感觉对不起大自然的养育。。。