最近在做一個類似於寫日記的程序,想法是左邊一列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這個接口遇到的問題,現在在想怎么來做這個功能,有網友看到的話可以提供一點建議 謝謝