天天看點

QT QDir

QDir類提供了對目錄結構及其内容的通路。

QDir用于操作路徑名、通路有關路徑和檔案的資訊以及操作底層檔案系統。它也可以用來通路Qt的資源系統。

Qt使用"/"作為通用的目錄分隔符,就像在url中使用"/"作為路徑分隔符一樣。如果您總是使用“/”作為目錄分隔符,Qt将轉換您的路徑以符合底層作業系統。

QDir可以使用相對路徑或絕對路徑指向檔案。絕對路徑以目錄分隔符開始(在Windows下,可選前面是驅動器規範)。相對檔案名以目錄名或檔案名開頭,并指定相對于目前目錄的路徑。

絕對路徑示例:

QDir("/home/user/Documents")
QDir("C:/Documents and Settings")
           

在Windows上,上面的第二個示例用于通路檔案時将被轉換為C:\Documents and Settings。

相對路徑示例:

QDir("images/landscape.png")
           

您可以使用isRelative()或isAbsolute()函數來檢查QDir是使用相對檔案路徑還是絕對檔案路徑。調用makeAbsolute()将相對QDir轉換為絕對QDir。

導航和目錄操作

可以使用path()函數擷取目錄的路徑,并使用setPath()函數設定新的路徑。一個目錄的絕對路徑可以通過調用absolutePath()來找到。

目錄的名稱可以使用dirName()函數找到。這通常傳回絕對路徑中指定目錄位置的最後一個元素。然而,如果QDir表示目前目錄,它也可以傳回"."。

QDir("Documents/Letters/Applications").dirName() // "Applications"
QDir().dirName()                                 // "."
           

目錄的路徑也可以用cd()和cdUp()函數更改,它們的操作方式類似于熟悉的shell指令。當使用現有目錄的名稱調用cd()時,QDir對象更改目錄,以代替它表示該目錄。cdUp()函數改變QDir對象的目錄,使其引用其父目錄;即cd("..")相當于cdUp()。

可以使用mkdir()建立目錄,使用rename()重命名目錄,使用rmdir()删除目錄。

您可以使用exists()來測試給定名稱的目錄是否存在,并且可以使用isReadable()、isAbsolute()、isRelative()和isRoot()來測試目錄的屬性。

refresh()函數從磁盤重新讀取目錄資料。

檔案和目錄内容

目錄包含許多表示檔案、目錄和符号連結的條目。目錄中的條目數由count()傳回。一個目錄中所有條目的名字的字元串清單可以通過entryList()獲得。如果您需要關于每個條目的資訊,請使用entryInfoList()來擷取QFileInfo對象清單。

目錄中的檔案和目錄的路徑可以使用filePath()和absoluteFilePath()構造。函數的作用是:傳回指定檔案或目錄相對于QDir對象的路徑;absoluteFilePath()傳回指定檔案或目錄的絕對路徑。這兩個函數都不檢查檔案或目錄是否存在;它們隻建造路徑。

QDir directory("Documents/Letters");
QString path = directory.filePath("contents.txt");
QString absolutePath = directory.absoluteFilePath("contents.txt");
           

可以使用remove()函數來删除檔案。目錄不能像檔案一樣被删除;使用rmdir()來删除它們。

通過對QDir對象應用過濾器,可以減少entryList()和entryInfoList()傳回的條目的數量。您可以應用名稱篩選器來指定帶有通配符的模式,檔案名需要比對,屬性篩選器可以選擇條目的屬性,并可以區分檔案和目錄,以及排序順序。

名稱過濾器是傳遞給setNameFilters()的字元串清單。屬性過濾器由按位或組合的過濾器組成,在調用setFilter()時指定這些過濾器。排序順序是使用setSorting()和SortFlags的位OR組合來指定的。

您可以使用match()函數來測試檔案名是否與過濾器比對。

在調用entryList()和entryInfoList()時也可以指定過濾器和排序順序标志,以覆寫之前定義的行為。

目前目錄和其他特殊路徑

通過許多傳回QDir對象的靜态函數提供了對一些常見目錄的通路。也有相應的傳回字元串的函數:

QDir QString Return Value
current() currentPath() The application's working directory
home() homePath() The user's home directory
root() rootPath() The root directory
temp() tempPath() The system's temporary directory

靜态函數setCurrent()也可以用來設定應用程式的工作目錄。

如果你想找到包含應用程式可執行檔案的目錄,請參見QCoreApplication::applicationDirPath()。

靜态函數提供了包含檔案系統的每個裝置的根目錄清單。在Unix系統上,這将傳回一個包含單個根目錄"/"的清單;在Windows上,清單通常包含C:/,可能還有其他的驅動器号,如D:/,這取決于使用者的系統配置。

路徑操作和字元串

包含“。”元素(在路徑的該點引用目前目錄)、“..”元素(引用父目錄)和符号連結的路徑可以使用canonicalPath()函數簡化為規範形式。

路徑也可以通過使用cleanPath()來删除備援的"/"和".."元素來簡化。

有時需要能夠以使用者平台的本機表示形式顯示路徑。靜态toNativeSeparators()函數傳回指定路徑的副本,其中每個目錄分隔符都被底層作業系統的适當分隔符替換。

例子

檢查目錄是否存在:

QDir dir("example");
if (!dir.exists())
    qWarning("Cannot find the example directory");
           

(我們也可以使用靜态便利函數QFile::exists())

周遊目錄并讀取檔案:

QDir dir = QDir::root();                 // "/"
if (!dir.cd("tmp")) {                    // "/tmp"
    qWarning("Cannot find the \"/tmp\" directory");
} else {
    QFile file(dir.filePath("ex1.txt")); // "/tmp/ex1.txt"
    if (!file.open(QIODevice::ReadWrite))
        qWarning("Cannot create the file %s", file.name());
}
           

列出目前目錄中所有檔案(不包括符号連結)的程式,按大小排序,最小的優先:

#include <QDir>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QDir dir;
    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    dir.setSorting(QDir::Size | QDir::Reversed);

    QFileInfoList list = dir.entryInfoList();
    std::cout << "     Bytes Filename" << std::endl;
    for (int i = 0; i < list.size(); ++i) {
        QFileInfo fileInfo = list.at(i);
        std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10)
                                                .arg(fileInfo.fileName()));
        std::cout << std::endl;
    }
    return 0;
}
           

參見QFileInfo, QFile, QFileDialog, QCoreApplication::applicationDirPath()和Find Files Example。

繼續閱讀