Qt 文件處理詳細講解教程 下篇
接著我我們上一篇內容講,Qt 文件處理詳細講解教程 上篇。主要介紹了目錄操作和文件的管理、監(jiān)視文件系統(tǒng)的變化、 文件引擎一些知識。
目錄操作和文件管理
QDir類具有存取目錄結構和內容的能力。使用QDir可以操作目錄,存取目錄或文件信息,操作底層文件系統(tǒng),而且還可以存取Qt的資源文件。Qt使用/作為通用的目錄分割符和URL路徑分隔符。Qt可以使用相對路徑和絕對路徑指向一個文件,isRelative()和isAbsolute()函數可以判斷QDir對象使用的是相對路徑還是絕對路徑。將相對路徑轉換為絕對路徑使用makeAbsolute()函數。目錄路徑可以通過path()函數返回,通過setPath()函數設置新路徑,絕對路徑使用absolutePath()返回。
目錄名可以使用dirName()返回。目錄的路徑可以通過cd() cdUp()改變,可以使用mkdir()創(chuàng)建目錄,rename()改變目錄名。判斷目錄是否存在可以使用exists(),目錄的屬性可以使用 isReadable(),isAbsolute(),isRelative()和isRoot()來獲取,目錄下有很多條目,包括文件,目錄和符號鏈接,總的條目數可以使用count()來統(tǒng)計。entryList()可以返回目錄下所有條目組成的字符串鏈表,文件可以使用remove()函數刪除,rmdir()刪除目錄。
linux du命令
- int main(int argc, char **argv)
- {
- QCoreApplication app(argc,argv);
- QStringList args=app.arguments();
- QString path;
- if(args.count()>1)
- path=args[1];
- else
- path=QDir::currentPath();
- qDebug()< du(path);
- return 0;
- }
- qint64 du(const QString &path)
- {
- QDir dir(path);
- qint64 size=0;
- foreach(QFileInfo fileInfo,dir.entryInfoList(QDir::Files))
- size+=fileInfo.size();
- foreach(QString subDir,dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
- size+=du(path+Dir::separator()+subDir);
- char unit=\\\'B\\\';
- if(curSize>1024)
- {
- curSize/=1024;
- unit=\\\'K\\\';
- if(curSize>1024)
- {
- curSize/=1024;
- unit=\\\'M\\\';
- if(curSize>1024)
- {
- curSize/=1024;
- unit=\\\'G\\\';
- }
- }
- }
- cout< return size;
- }
函數du()中,entryInfoList(QDir::Files)函數返回文件信息,然后根據這些信息計算文件大小,接下來判斷是否有子目錄,如果有則遞歸計算。dir.etnryList(QDir::Dirs|QDir::NoDotAndDotDot)返回所有子目錄并過濾掉. .. 目錄。由于windows(),linux平臺/ \差異,使用QDir::separator()函數來返回特定平臺的目錄分隔符。另外QDirIterator可以完成
枚舉目錄的功能,Qt4.3還引入了文件搜索前綴的概念,文件搜索前綴時至少由兩個字符組成,用來搜索指定文件的路徑。
- QDir::setSearchPaths("docs",QStringList("c:\My Docments"));
- QDir::addSearchPaht("Docs",QStringList("D:|Documents"));
- QFile file("docs::qt4.doc");
這樣就可以在兩個目錄中查找。
文件管理
QFileInfo類提供了與系統(tǒng)無關的文件信心,它能提供文明名和路徑,存取權限,以及文件是否為目錄或符號鏈接,文件大小,以及***修改/讀取的時間等。
QFileInfo也能從資源中獲取信息。QFileInfo可以使用相對路徑或絕對路徑。文件名可以在QFileInfo的構造函數中傳遞,也可以使用setFile()函數指定,要判斷一個函數是否存在,使用exits()函數,文件大小可以通過size()函數獲取,文件類型可以通過isFile(),isDir(),isSymLink()來獲取,symLinkTarget()函數返回符號鏈接所指向的真正文件名。QFileInfo提供refresh函數刷新文件信息,如果需要QFileInfo每次從文件系統(tǒng)讀取信息,二不是從緩存讀取,可以使用setCaching(false)關閉緩存。
文件名和目錄可以通過path()和fileName()分解,fileName()返回的部分可以通過baseName()和extension()來獲得主文件名和擴展文件名,文件的操作日期可以通過created(),lastModified()和lastRead()獲取,文件的存取權限可通國isReadable,isWriteable(),isExcutetable()獲取,文件的屬主可以通過owner(),ownerId,group(),groupId()獲取,文件的權限和屬主也可以通過 permission()一起讀取。
監(jiān)視文件系統(tǒng)的變化
在Qt中可以使用QFileSystemWatcher類來監(jiān)視文件和目錄的改變.使用addPath()函數來監(jiān)視指定的文件和目錄,如果需要監(jiān)視多個目錄,使用addPaths()來加入監(jiān)視,如果要一處不需要監(jiān)視的目錄,可以使用removePath(),removePaths()函數.當監(jiān)視的文件被修改或刪除時,產生一個fileChanged()信號,如果被監(jiān)視的目錄被修改或刪除,產生directoryChanged()信號,下例實現了監(jiān)視指定目錄的功能.
- #include
- #include
- #include
- #Include"Msg.h"
- using namespace std;
- int main(int argc,char **argv)
- {
- QApplication app(argc,argv);
- QTextCodec::setCodecForTr(QTextCodec::codecForLocale())
- Msg msg;
- msg.show();
- return app.exec();
- }
- Msg::Msg()
- {
- QFont font;
- font.setPointSize(24);
- setFont(font);
- QStringList args=qApp->arguments();
- QString path;
- if(args.count()>1)
- path=args[1];
- else
- path=QDir::currentPath();
- label=new QLabel();
- label->setText(tr("監(jiān)視的目錄:")+path);
- QVBoxLayout *layout=new QVBoxLayout;
- layout->addWidget(label);
- setLayout(layout);
- fsWatcher.addPath(path);
- connect(&fsWatcher,SIGNAL(directoryChanged(QString)),this,SLOT(directoryChanged(QString)));
- }
在構造函數中讀取命令指定的目錄作為監(jiān)視目錄,如果沒有指定則監(jiān)視當前目錄,使用connect()函數將目錄的directroyChanged()信號和響應函數連接.
- void Msg::directoryChanged(QString path)
- {
- QMessageBox::information(NULL,tr("目錄變化"),path);
- }
文件引擎
Qt的QtDir,QFile,QFileInfo類在內部都使用一個類,QAbstractFileEngine.通過繼承QAbstractFileEngine類,可以編寫自己的文件處理函數,然后繼承QAbstractFileEngineHander類注冊自己的文件引擎,然后這樣就可以使用自己的文件讀取引擎了.QAbstractFileEngineHandler是創(chuàng)建QAbstractFileEngine的類工廠.當打開一個文件時,Qt通過內部注冊的文件引擎鏈表,選擇合適的文件引擎并創(chuàng)建相應的引擎對象.為了安裝一個特定的文件引擎,必須繼承QAbstractFileEngineHandler并實現create()函數.實例化引擎時Qt自動注冊該引擎,***注冊的引擎比之前注冊的優(yōu)先級高.
如果想讀取tar文件的引擎,可以從QAbstractFileEngineHandler類繼承
- class TarEngineHandler:public QAbstractFileEngineHandler
- {
- public:
- QAbstractFileEngine *create(const QString &fileName) const;
- };
- create()函數返回TarEngine對象,TarEngine是文件引擎,時真正的文件處理類.
- QAbstractFileEngine *TarEngineHandler::create(const QString &fileName) const
- {
- return fileName.toLower().endsWith(".tar")?new TarEngine(fileName):0;
- }
小結:Qt 文件處理的內容介紹完了,希望本篇對你有幫助,以后有好的文章,一定與大家分享!敬請留言。