轉載:http://blog.csdn.net/liuhongwei123888/article/details/6084761
今天學習QT的文件操作
1、QIODevice 直接繼承自QObject
QIODevice類是輸入/輸出設備的基類。
QIODevice為設備提供了公共實現和抽象接口用於讀寫塊數據。 QIODevice是一個抽象類,不能被實例化。
被Q3Socket,Q3SocketDevice,QAbstractSocket,QBuffer,QFile,QLocalSocket,QNetworkReply,QProcess繼承.
===============================================================================================
2、QFile
繼承自QIODevice
QFile類是一個操作文件的輸入/輸出設備。
QFile是用來讀寫二進制文件和文本文件的輸入/輸出設備。QFile可以自己單獨被使用,但是如果和QDataStream或QTextStream一起使用將更加方便。
文件名通常可以通過構造函數來傳遞,但也可以使用setName()來設置。目錄分隔符在任何操作系統下都使用“/",“/"不被支持。你可以通過exists()來檢查一個文件是否存在並且可以通過remove()來移去一個文件。更多操作系統相關的高級文件系統操作QT提供了QFileInfo和QDir類.
文件可以用open()來打開、用close()來關閉、用flush()來刷新。數據通常可以使用QDataStream或者QTextStream進行讀寫,但你也可以使用read(),readLine(),readAll(),write()讀寫。QFile也支持getChar(),putChar(),和ungetChar()
size()可以返回文件的大小。你可以通過使用pos()函數得到當前文件位置或者使用seek()移到一個新的文件位置。如果你到了文件的末尾,atEnd()返回真。
一行一行直接讀取文件
- QFile file("/home/administrator/testdir/test.txt");
- if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- qDebug()<<"Can't open the file!"<<endl;
- }
- while(!file.atEnd()) {
- QByteArray line = file.readLine();
- QString str(line);
- qDebug()<< str;
- }
QFile file("/home/administrator/testdir/test.txt"); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug()<<"Can't open the file!"<<endl; } while(!file.atEnd()) { QByteArray line = file.readLine(); QString str(line); qDebug()<< str; }
使用QTextStream讀取文件
- QFile file("/proc/modules");
- if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
- return;
- QTextStream in(&file);
- QString line = in.readLine();
- while (!line.isNull()) {
- process_line(line);
- line = in.readLine();
- }
QFile file("/proc/modules"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; QTextStream in(&file); QString line = in.readLine(); while (!line.isNull()) { process_line(line); line = in.readLine(); }
使用QTextStream寫入文件
- QFile file("out.txt");
- if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
- return;
- QTextStream out(&file);
- out << "The magic number is: " << 49 << "\n";
QFile file("out.txt"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&file); out << "The magic number is: " << 49 << "\n";
QDataStream 重載了運算符了"<<"寫數據,>>讀數據
- QFile file("/home/administrator/testdir/test.txt");
- if(!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
- qDebug()<<"Can't open the file!"<<endl;
- }
- QTextStream stream(&file);
- QString line_in;
- // while( !stream.atEnd()){
- // line_in = stream.readLine();
- // qDebug() << line_in;
- // }
- // stream.seek(stream.pos());
- stream.seek(file.size());//將當前讀取文件指針移動到文件末尾
- int count = 0;
- while(count < 10){
- stream << QObject::trUtf8("新建行:") <<++count<<"/n";
- }
- stream.seek(0);//將當前讀取文件指針移動到文件開始
- while( !stream.atEnd()){
- line_in = stream.readLine();
- qDebug() << line_in;
- }
QFile file("/home/administrator/testdir/test.txt"); if(!file.open(QIODevice::ReadWrite | QIODevice::Text)) { qDebug()<<"Can't open the file!"<<endl; } QTextStream stream(&file); QString line_in; // while( !stream.atEnd()){ // line_in = stream.readLine(); // qDebug() << line_in; // } // stream.seek(stream.pos()); stream.seek(file.size());//將當前讀取文件指針移動到文件末尾 int count = 0; while(count < 10){ stream << QObject::trUtf8("新建行:") <<++count<<"/n"; } stream.seek(0);//將當前讀取文件指針移動到文件開始 while( !stream.atEnd()){ line_in = stream.readLine(); qDebug() << line_in; }
3、QDir
QDir類提供了訪問目錄結構和他們的內容。
QDir類提供了訪問目錄結構和它們的內容的與平台無關的方式。 QDir用來操作路徑名稱、關於路徑和文件的訪問信息和操作底層文件系統。 QDir使用相對或絕對文件路徑來指向一個文件。絕對路徑是從目錄分隔符“/”或者帶有一個驅動器標識(除了在Unix下)。如果你總是使用“/”作為目錄分隔符,Qt將會把你的路徑轉化為符合底層的操作系統的。相對文件名是由一個目錄名稱或者文件名開始並且指定一個相對於當前路徑的路徑。 例如絕對路徑: QDir("/home/administrator/soft"); QDir("D:/software"); 我們可以使用isRelative()或isAbsolute()函數確認QDir是用的相對路徑還是絕對路徑。使用makeAbsolute()來轉換相對路徑的QDir轉換成絕對路徑的QDir.
- QDir d("D:/");
- d.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks | QDir::AllDirs);//列出文件,列出隱藏文件(在Unix下就是以.開始的為文件),不列出符號鏈接(不支持符號連接的操作系統會忽略)
- d.setSorting(QDir::Size | QDir::Reversed);//按文件大小排序,相反的排序順序
- const QFileInfoList list = d.entryInfoList();//返回這個目錄中所有目錄和文件的QFileInfo對象的列表
- QFileInfoList::const_iterator iterator = list.begin();
- qDebug() << "目錄和文件的數量: " << d.count();//返回找到的目錄和文件的數量
- qDebug() << "fileName/t/t/tsize/t/t/t";
- while(iterator != list.end()){
- qDebug() << (*iterator).fileName()<<"/t/t/t"<<(*iterator).size();
- iterator++;
- }
- qDebug() << "當前目錄: " << d.current();//返回應用程序當前目錄。
- qDebug() << "當前目錄的絕對路徑" << d.currentPath();//返回應用程序當前目錄的絕對路徑。
- // const QList<QString> list = d.entryList(); //返回這個目錄中所有目錄和文件的名稱的列表
- // QList<QString>::const_iterator iterator = list.begin();
- // while(iterator != list.end()){
- // qDebug() << (*iterator);
- // iterator++;
- // }
QDir d("D:/"); d.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks | QDir::AllDirs);//列出文件,列出隱藏文件(在Unix下就是以.開始的為文件),不列出符號鏈接(不支持符號連接的操作系統會忽略) d.setSorting(QDir::Size | QDir::Reversed);//按文件大小排序,相反的排序順序 const QFileInfoList list = d.entryInfoList();//返回這個目錄中所有目錄和文件的QFileInfo對象的列表 QFileInfoList::const_iterator iterator = list.begin(); qDebug() << "目錄和文件的數量: " << d.count();//返回找到的目錄和文件的數量 qDebug() << "fileName/t/t/tsize/t/t/t"; while(iterator != list.end()){ qDebug() << (*iterator).fileName()<<"/t/t/t"<<(*iterator).size(); iterator++; } qDebug() << "當前目錄: " << d.current();//返回應用程序當前目錄。 qDebug() << "當前目錄的絕對路徑" << d.currentPath();//返回應用程序當前目錄的絕對路徑。 // const QList<QString> list = d.entryList(); //返回這個目錄中所有目錄和文件的名稱的列表 // QList<QString>::const_iterator iterator = list.begin(); // while(iterator != list.end()){ // qDebug() << (*iterator); // iterator++; // }
運行結果:
4、QFileInfo
QFileInfo類提供了一個與平台無關的文件信息.
QFileInfo提供了關於系統中的文件名稱和位置,訪問權限和是否是符號鏈接,文件大小和上次修改/讀寫時間等,也能被用於Qt資源文件。
QFileInfo能通過相對/絕對路徑指向一個文件。
可以使用isFile(),isDir(),isSymLink().symLinkTarget()函數提供符號鏈接的目標文件。
在Unix(包括Mac OS X)的符號鏈接具有與目標文件相同的大小(),因為Unix透明地處理符號鏈接;同樣,打開一個符號連接使用的QFile有效地打開鏈接的目標.
在Windows中,符號鏈接(快捷方式)的lnk文件。它大小()的是,符號鏈接(而不是鏈接的目標)的大小,打開一個符號連接使用的QFile並打開。lnk文件。例如
- #include <QtCore/QCoreApplication>
- #include <QFileInfo>
- #include <QDebug>
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- QFileInfo info1("E:/meego/vi_command.lnk");
- qDebug() << info1.isSymLink();
- qDebug() << info1.absoluteFilePath();
- qDebug() << info1.size();
- qDebug() << info1.symLinkTarget();
- qDebug() << "**********************";
- QFileInfo info2(info1.symLinkTarget());
- qDebug() << info2.isSymLink();
- qDebug() << info2.absoluteFilePath();
- qDebug() << info2.size();
- return a.exec();
- }
#include <QtCore/QCoreApplication> #include <QFileInfo> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QFileInfo info1("E:/meego/vi_command.lnk"); qDebug() << info1.isSymLink(); qDebug() << info1.absoluteFilePath(); qDebug() << info1.size(); qDebug() << info1.symLinkTarget(); qDebug() << "**********************"; QFileInfo info2(info1.symLinkTarget()); qDebug() << info2.isSymLink(); qDebug() << info2.absoluteFilePath(); qDebug() << info2.size(); return a.exec(); }
運行結果:
- #include <QtCore/QCoreApplication>
- #include <QFileInfo>
- #include <QDebug>
- #include <QTextCodec>
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- QTextCodec *codec = QTextCodec::codecForName("GB2312");
- QTextCodec::setCodecForLocale(codec);
- QTextCodec::setCodecForCStrings(codec);
- QTextCodec::setCodecForTr(codec);
- QFileInfo info("E:/meego/基本命令與VI.Command.txt");
- qDebug() << info.baseName();//不包括后綴名
- qDebug() << info.bundleName();//只有在Mac OS才有用,其它平台為空字符串
- qDebug() << info.suffix();//后綴名
- qDebug() << info.completeBaseName();//不包括后綴名
- qDebug() << info.completeSuffix();//完整的后綴名
- return a.exec();
- }
運行結果: