最近在做一个类似于写日记的程序,想法是左边一列tableview用来显示所打开的文件夹下的日志文件
右边一个textEdit用来显示单击日志条目时显示对应日志文件,另外可以保存所有日志文件显示时的状态。
最开始想的是通过map接口来进行文件映射(对文件映射不熟悉所以使用它)
在建立关联文件映射的时候,发现如果是新建文件,则映射建立失败
如果是旧文件但如果文件中无内容,也会失败
经过测试和排查,发现接口
uchar *QFileDevice::map(qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions)
map的意思就是将文件从offset位置开始,到size字节的数据映射到内存中(但是size的大小也没有规定诶)
当时想的是,对内存映射进行修改然后文件也会对应修改,就比较爽了赛。
结果
1 try{
2 if(!item->m_file.isOpen()){
3 item->m_file.setFileName(item->FilePath);
4 item->m_file.open(QIODevice::ReadWrite);
5 item->m_pvFileBuffer = item->m_file.map(0, item->Size);
6
7 if(item->m_pvFileBuffer == NULL){
8 //qDebug() << item->m_file.error() ;
9 if(item->m_file.isOpen())
10 item->m_file.close();
11 }
12 }
13 }catch(...){
14 item->m_file.unmap(item->m_pvFileBuffer);
15 item->m_pvFileBuffer = NULL;
16 if(item->m_file.isOpen())
17 item->m_file.close();
18 }
这样子是建立不了内存映射的。
后来在之前增加以下函数,或者是先写入数据或者是先初始化文件一个固定大小,map才能映射成功
//newFile.write(" ");//初始化新文件,否则建立映射会失败
newFile.resize(100);
所以如果用map做这个日志功能,比较麻烦
它不能实现文件自增长,如果你给定了一个初始化大小size,在文件大小达到这个size的时候,你需要重新建立map,否则会失败。
以上是map这个接口遇到的问题,现在在想怎么来做这个功能,有网友看到的话可以提供一点建议 谢谢