From Gossip@caterpillar

Qt3 Gossip: QDir 類別

以下翻譯自Qt的線上文件,有關於QDir的說明:

QDir類別提供對目錄架構的存取,而它的內容與平台無關。

QDir被用來處理路徑名稱、根據路徑與檔案來存取資訊,並且根據檔案系統進行處理。

QDir可以使用相對路徑或是絕對路徑來指向一個檔案,絕對路徑以目錄符號"/"作為開始(或是Windows下的磁碟機代號),如果您使用"/"作為路 徑分隔,Qt會根據作業系統進行轉換,相對路徑檔案則是以目錄名稱或檔案名稱作為開始,並根據目前的目錄來指定相對於它的路徑。

"目前"的路徑是指應用程式目前的工作目錄,QDir可以使用setPath()與path()來設定與取得自己的路徑。

絕對路徑的一個例子是"/tmp/quartz",相對路徑看起來可能是"src/fatlib",您可以使用isRelative()來檢查QDir是 使用相對路徑或是絕對路徑,使用convertToAbs()可以將相對的QDir轉換為絕對路徑,要簡化路徑的表示就使用cleanDirPath (),要取得一個沒有符號連結或是重覆的".."元素,請使用canonicalPath(),我們可以使用setPath()來設定路徑,用cd()與 cdUp()來改變路徑。

QDir提供幾個靜態方法,例如setCurrent()用來設定應用程式目前的工作路徑,而currentDirPath()用來取得應用程式的工作路 徑,要一些一般路徑的存取可以使用current()、home()與root(),它們傳回QDir物件,或是使用currentDirPath()、 homeDirPath()與rootDirPath(),它們傳回路徑的字串。

目錄中的項目個數可以使用count()方法來取得,使用entryList()來取得一個目錄下的所有檔案與子目錄字串名稱。如果您想要的是 QFileInfo指標,使用entryInfoList(),這兩個方法都可以使用名稱過濾、屬性過濾(像是唯讀、檔案或是目錄等等)與排序,過濾與排 序可以使用setNameFilter()、setFilter()與setSorting()方法來設定,它們也可以用於entryList()、 entryInfoList()參數的指定上。

使用mkdir()方法可以建立一個新的目錄,使用rename()方法來更改目錄名稱,使用rmdir()方法將一個已經存在的目錄移除,使用remove()方法來移除檔案,您可以使用exists()、isReadable()與isRoot()方法來測試目錄。

要以檔案名稱取得路徑,請使用filePath()方法,要取得目錄名稱請使用dirName();這兩個方法都無法檢查檔案或目錄是否存在。

根目錄的顯示是由drives()提供;在Unix系統下這會傳回包括根目錄"/"的列示;在Windows下則通常包括"D:/"等。

如果您想要路徑的形式是基於作業系統的適當形式,使用convertSeparetors()。

看看目錄是否存在:
QDir d( "example" );                        // "./example"
if ( !d.exists() )
    qWarning( "Cannot find the example directory" );

進入目錄並讀取檔案:
QDir d = QDir::root();                      // "/"
if ( !d.cd("tmp") ) {                       // "/tmp"
    qWarning( "Cannot find the \"/tmp\" directory" );
} else {
    QFile f( d.filePath("ex1.txt") );       // "/tmp/ex1.txt"
    if ( !f.open(IO_ReadWrite) )
        qWarning( "Cannot create the file %s", f.name() );
}

下面的程式顯示目前目錄下的所有檔案(包括符號連結),並以大小作排序,最小的排在前面:
#include <stdio.h>
#include <qdir.h>

int main( int argc, char **argv )
{
QDir d;
d.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks );
d.setSorting( QDir::Size | QDir::Reversed );

const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list );
QFileInfo *fi;

printf( " Bytes Filename\n" );
while ( (fi = it.current()) != 0 ) {
printf( "%10li %s\n", fi->size(), fi->fileName().latin1() );
++it;
}
return 0;
}