關於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這個接口遇到的問題,現在在想怎么來做這個功能,有網友看到的話可以提供一點建議 謝謝

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM