Qt实现遍历文件夹和文件目录(递归) .

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

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

猜你喜欢

转载自blog.csdn.net/boyemachao/article/details/52459746