QFileInfo類為我們提供了系統無關的文件信息,包括文件的名字和在文件系統中位置,文件的訪問權限,是否是目錄或符合鏈接,等等。並且,通過這個類,可以修改文件的大小和最后修改、讀取時間。同時,QFileInfo類也可以用來取到Qt 資源的相關信息。
QFileInfo既可以表示絕對路徑,也可以表示相對路徑的文件。其中,絕對路徑就是已"/"開始的路徑(或者在Windows系統上就是已某個盤符開始的路徑)。相對路徑就是相對於當前目錄的一個文件或目錄。我們在開發中,可以使用給類的成員函數isRelative() 來判斷一個QFileInfo表示的是一個相對路徑還是一個絕對路徑。也可以使用makeAbsolute()將一個相對路徑轉換為一個絕對路徑。
可以使用exists() 函數判斷一個文件是否存在,使用size()函數獲取文件的大小。isFile()、isDir()、isSymLink() 可以判斷文件的類型,普通文件、目錄或是符號鏈接。 若QFileInfo 當前代表的是一個符號鏈接,sysLinkTarget() 函數返回符號鏈接所指向的文件。在Unix平台上,包括OSX和iOS,符號鏈接和它所指向的文件具有同樣的大小,因為Unix透明的看待普通文件和符號鏈接;同樣,打開一個符號鏈接進行讀寫時,其實是打開了它所指向的真實文件。例如:
#ifdef Q_OS_UNIX
QFileInfo info1("/home/bob/bin/untabify");
info1.isSymLink(); // returns true
info1.absoluteFilePath(); // returns "/home/bob/bin/untabify"
info1.size(); // returns 56201
info1.symLinkTarget(); // returns "/opt/pretty++/bin/untabify"
QFileInfo info2(info1.symLinkTarget());
info2.isSymLink(); // returns false
info2.absoluteFilePath(); // returns "/opt/pretty++/bin/untabify"
info2.size(); // returns 56201
#endif
在Windows平台上,符號鏈接是 .lnk 文件,也就是所謂的快捷方式。此時,size() 函數返回的是符號鏈接本身的大小,同樣,打開一個 .lnk 文件就是打開lnk文件本身,並不是打開它所指向的真實文件。例如:
#ifdef Q_OS_WIN
QFileInfo info1("C:\\Documents and Settings\\Bob\\untabify.lnk");
info1.isSymLink(); // returns true
info1.absoluteFilePath(); // returns "C:/Documents and Settings/Bob/untabify.lnk"
info1.size(); // returns 743
info1.symLinkTarget(); // returns "C:/Pretty++/untabify"
QFileInfo info2(info1.symLinkTarget());
info2.isSymLink(); // returns false
info2.absoluteFilePath(); // returns "C:/Pretty++/untabify"
info2.size(); // returns 63942
#endif
關於文件名的一些元素可以通過path() 和 fileName() 獲取。其中,fileName() 有可能具有后綴等信息,可以使用baseName()、suffix() 或 completeSuffix() 來獲取。但是,若QFileInfo代表的是目錄,則QFileInfo不會自動在路徑后添加一個"/"。如果你需要這個"/",需要自己手動添加。
文件的相關日期可以使用created()、lastModified()和lastRead() 獲取;而有關文件訪問權限的相關信息可以通過isReadable()、isWriteable()和isExecutable() 獲得;文件的所有者信息可以通過owner()、ownerId()、group()和groupId() 獲得。
注意,在NTFS文件系統上,特別是Windows,出於性能考慮,文件的所有權和權限檢查在默認情況下是被禁用的。要使能這個功能,可以在文件中添加下面這行代碼:
extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
這樣一來,我們可以方便的通過遞增或遞減這個變量還使能或禁用權限檢查功能:
qt_ntfs_permission_lookup++; // turn checking on
qt_ntfs_permission_lookup--; // turn it off again
一些QFileInfo函數會查詢整個文件系統,但出於性能原因,還有一些函數只操作文件名本身。例如,為了獲得一個文件的絕對路徑,absolutePath()必須查詢文件系統。而path()函數,可以直接作用於文件名本身,所以,path() 函數的運行會更快。
另外還要注意,為了加速對文件信息的獲取,QFileInfo會緩存文件的信息。但另一方面,文件隨時都有可能被其他用戶或程序,或當前程序的其他函數所改變,所以,QFileInfo還提供了一個refresh() 函數,重新讀取文件信息。如果你想關閉該緩存功能,已確保每次訪問文件信息時都去訪問文件系統獲取當前最新的信息,可以通過調用setCaching(false)來完成。
下面我們就來具體看一下QFileInfo類常用的成員函數。首先,從構造函數開始:
QFileInfo()
QFileInfo(const QString &file)
QFileInfo(const QFile &file)
QFileInfo(const QDir &dir, const QString &file)
QFileInfo(const QFileInfo &fileinfo)
這些構造函數只是只是接受不同的參數類型而已。其中,對應第三個構造函數來說,如果dir是一個相對路徑,QFileInfo也會是相對路徑;如果file是絕對路徑,那么,dir參數會被忽略。
緊接着,我們主要來看一看,QFileInfo類中能返回文件在文件系統中的位置的函數,在此,對它們的返回值進行一下明確。
QDir QFileInfo::absoluteDir() const
返回一個代碼文件絕對路徑的QDir對象。
QString QFileInfo::absoluteFilePath() const
返回一個保護文件名的絕對路徑。在Unix系統上,會返回一個已"/"開始的目錄;在Windows平台上,返回一個已驅動器盤符開始的目錄,如"C:\";例如:
QFileInfo fi("C:/temp/foo"); => fi.absoluteFilePath() => "C:/temp/foo"。
QString QFileInfo::absolutePath() const
返回文件的絕對路徑,不包括文件名。
QString QFileInfo::fileName() const
只返回文件名,不包括路徑。例如:
QFileInfo fi("/tmp/archive.tar.gz");
QString name = fi.fileName(); // name = "archive.tar.gz"
注意,如果QFileInfo對象表示的是一個已"/"結尾的路徑,那么該函數返回空字符串。
QString QFileInfo::filePath() const
返回文件的名字,包括路徑(可能是絕對路徑,也可能是相對路徑)
QString QFileInfo::path() const
返回文件的路徑,不包括文件名。但是,如果QFileInfo對象表示的是一個已"/"結尾的路徑,那么文件名被認為是空的,此時,該函數返回整個完整路徑。
具體看了每個函數的返回值含義后,我們再通過一個例子,打印出每個函數的返回值,直觀的看一看每個函數的意思,以便加深印象和理解。
新建一個Qt控制台程序,然后在當前目錄下新建test目錄,在test目錄在新建一個test.txt文件,一會我們就以這個文件來測試我們的程序。
程序代碼如下:
#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>
#include <QDir>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFileInfo info("test/test.txt");
if(!info.exists())
{
qDebug() << "error";
return 0;
}
//返回一個代碼文件絕對路徑的QDir對象。
qDebug() << "absoluteDir: " << info.absoluteDir();
//返回一個包含文件名的絕對路徑
qDebug() << "absoluteFilePath: " << info.absoluteFilePath();
//返回文件的絕對路徑,不包括文件名。
qDebug() << "absolutePath: " << info.absolutePath();
//只返回文件名,不包括路徑。例如:
qDebug() << "fileName: " << info.fileName();
//返回文件的名字,包括路徑(可能是絕對路徑,也可能是相對路徑)
qDebug() << "filePath: " << info.filePath();
//返回文件的路徑,不包括文件名。
qDebug() << "path: " << info.path();
return a.exec();
}
程序輸出結果如下:
由此可以看到,各個函數之間的區別。大家在使用過程中,要根據自己的需求,調用正確的函數。
---------------------
作者:求道玉
來源:CSDN
原文:https://blog.csdn.net/Amnes1a/article/details/65444966
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!