关于Qt QFileDevice::map()接口的一些学习记录

最近在做一个类似于写日记的程序,想法是左边一列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         }
View Code


这样子是建立不了内存映射的。

后来在之前增加以下函数,或者是先写入数据或者是先初始化文件一个固定大小,map才能映射成功

//newFile.write(" ");//初始化新文件,否则建立映射会失败
newFile.resize(100);

 

所以如果用map做这个日志功能,比较麻烦

它不能实现文件自增长,如果你给定了一个初始化大小size,在文件大小达到这个size的时候,你需要重新建立map,否则会失败。

 

以上是map这个接口遇到的问题,现在在想怎么来做这个功能,有网友看到的话可以提供一点建议 谢谢

 

 

posted @ 2019-03-10 15:45  蓦然而然  阅读(4074)  评论(0编辑  收藏  举报