QDir類用於訪問目錄及其內容。QDir用於處理路徑名,獲取路徑及文件的相關信息,以及操作底層文件管理系統。他也可用於訪問Qt資源系統。
類似URLs,Qt將'/'作通用目錄分隔符。Qt會將以'/'作爲目錄分隔符的路徑翻譯給底層文件系統。
QDir用相對路徑或絕對路徑表示文件位置。絕對路徑以'/'開始(windows下,路徑前是否加驅動器可選)。相對路徑以目錄名或文件名開始,是一個相對於當前目錄的路徑。
絕對路徑例子:
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")
windows下,上面的第2個例子,訪問文件時,會被翻譯成 C:\Documents and Settings。
相對路徑例子:
QDir("images/landscape.png")
isRelative()和isAbsolute()用於查詢QDir使用的是相對路徑,還是絕對路徑。makeAbsolute()將相對路徑轉換爲絕對路徑。
導航和目錄操作
path()用於獲取目錄路徑,setPath()用於設置新路徑。absolutePath()用於獲取目錄的絕對路徑。
dirName()返回目錄名稱,返回值爲絕對路徑的最後一個元素,表示目錄的位置。若QDir表示當前目錄,dirName()返回"."。
QDir("Documents/Letters/Applications").dirName() // "Applications"
QDir().dirName() // "."
cd()、cdUp()能修改目錄所在路徑,他們運行方式與命令行(shell commands)類似。調用cd(),傳入一個存在的目錄,QDir對象用修改目錄,用新目錄代替原有目錄。調用cdUp(),QDir對象指向原有目
錄的父目錄。cdUp()等同於cd("..")。
mkdir()用於創建目錄,rename()用於修改目錄名稱,rmdir()用於刪除目錄。
exists()用於查詢目錄是否存在。isReadable()、isAbsolute()、isRelative()和isRoot()用於查詢目錄屬性。
refresh()用於從磁盤中重新讀取目錄數據。
文件和目錄相關內容:
目錄下包含的條目有,文件、目錄、符號鏈接。count()用於返回目錄下的條目數量。entryList()用於返回目錄下所有條目的名稱列表。entryInfoList用於獲取所有條目的詳細信息,每個條目的詳細信息
用QFileInfo表示。
filePath()和absoluteFilePath()用於創建目錄下文件和目錄的路徑。
filePath()用於返回指定文件或目錄的相對路徑(以QDir對象爲參照)。absoluteFilePath()用於返回指定文件或目錄的絕對路徑。這兩條函數都不檢查文件或目錄是否存在。他們僅構造路徑。
QDir directory("Documents/Letters");
QString path = directory.filePath("contents.txt");
QString absolutePath = directory.absoluteFilePath("contents.txt");
remove()用於刪除文件。目錄不能像文件那樣被刪除,用rmdir()來刪除他們。
在QDir對象上應用過濾器filter,可能會降低entryList()和entryInfoList()返回的條目數量。你可以給QDir對象設置一個名稱過濾器(需設定一個通配符,表明文件名稱需要匹配的條件)、一個屬性過濾
器(需選定條目若干屬性,能區別出文件和目錄)和一個排序。
名稱過濾器是一些字符串列表,由setnameFilters()傳入。多屬性過濾器可由多個單屬性過濾器的位或組合而成,由setFilter()傳入設定。setSorting()用於設置排序順序,設置內容爲多個排序標識的位
或組合。用match()測試文件名是否匹配過濾器。
調用entryList() and entryInfoList(),可能也需要設置過濾器和排序標識,從而重寫了以前操作。
當前路徑和其他指定路徑
一組返回值爲QDir的靜態函數爲普通目錄提供訪問服務
。此外,還有一組對應的返回值爲字符串的函數:
QDir QString 返回值
current() currentPath() 應用工作目錄
home() homePath() 用戶家目錄
root() rootPath() 根目錄
temp() tempPath() 系統臨時目錄
靜態函數setCurrent()用於設置應用工作目錄。
若想獲得應用執行文件所在目錄,詳見QCoreApplication::applicationDirPath()。
靜態函數drives()返回每一個裝有文件管理系統設備的根目錄列表。Unix系統下,返回的列表內僅有一個根目錄"/"。windows下,通常包含C:/,也有可能有其他盤符D:/,結果取決於用戶系統的設定。
路徑操作和字符串
"."代表當前目錄,包含"."的路徑都是當前目錄的相對路徑, ".."代表父目錄, 用canonicalPath()設置canonical格式,可減少符號鏈接數量。
用cleanPath()可簡化路徑,刪除其內多餘的"/"和".."。
當需要顯示用戶平臺的本地風格路徑時,靜態函數toNativeSeparators(),將指定的路徑中的分隔符替換爲與底層操作系統一致的分隔符後,後返回該路徑拷貝值。
例子:
檢查路徑是否存在:
QDir dir("example");
if (!dir.exists())
qWarning("Cannot find the example directory");
(也能用更方便的QFile::exist())
遍歷目錄並讀文件:
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;
}