Qt實現遍歷文件夾和文件目錄(遞歸)


http://blog.sina.com.cn/s/blog_668aae7801017gh7.html

bool FindFile(const QString & path)
{
QDir dir(path);
if (!dir.exists())
return false;
dir.setFilter(QDir::Dirs|QDir::Files);
dir.setSorting(QDir::DirsFirst);
QFileInfoList list = dir.entryInfoList();
int i=0;
do{

QFileInfo fileInfo = list.at(i);
if(fileInfo.fileName()=="."|fileInfo.fileName()=="..")
{
i++;
continue;
}
bool bisDir=fileInfo.isDir();
if(bisDir)
{
nFiles++;
std::cout << qPrintable(QString("%1 %2 %3").arg(fileInfo.size(), 10)
.arg(fileInfo.fileName(),10).arg(fileInfo.path()))<<endl;

FindFile(fileInfo.filePath());
}
else{
nFiles++;
std::cout << qPrintable(QString("%1 %2 %3").arg(fileInfo.size(), 10)
.arg(fileInfo.fileName(),10).arg(fileInfo.path()))<<endl;
}
i++;
}while(i<list.size());
return true;
}

 

 

 

詳細描述

QDir類提供了訪問目錄結構和它們的內容的與平台無關的方式。

QDir用來操作路徑名稱、關於路徑和文件的訪問信息和操作底層文件系統。

QDir使用相對或絕對文件路徑來指向一個文件。絕對路徑是從目錄分隔符“/”或者帶有一個驅動器標識(除了在Unix下)。如果你總是使用“/”作為目錄分隔符,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上,這個列表將包含“C:/”並且還有“D:/”等等。

如果你需要一個適應底層操作系統形式的路徑,請使用convertSeparators()。

實例:

請參考一個目錄是否存在。

    QDir d( "example" );                        // “./example”
    if ( !d.exists() )
        qWarning( "Cannot find the example directory" );
  

Traversing directories and reading a file.

    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;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM