【问题标题】:Get the path of first file in each directory or sub-directory获取每个目录或子目录中第一个文件的路径
【发布时间】:2020-06-02 16:20:23
【问题描述】:

我的目录结构如下:Root 目录包含一些子目录,其中放置了许多.txt 文件或一些sub-directories 再次包含具有相同扩展名的不同文件。

├───Root
│   ├───SubDir1
        └───file1.txt
│   ├───SubDir2
│   ├───SubDir3
│       └───SubSubDir1
            └───file1.txt
            └───file2.txt
│   └───SubDir4
│       └───SubSubDir1
        └───SubSubDir2
            └───file1.txt

我想将每个目录中的所有第一个文件路径保存在QStringList 中。例如:

/Root/SubDir1/file1.txt
/Root/SubDir3/SubSubDir1/file1.txt
/Root/SubDir4/SubSubDir2/file1.txt

以下代码为我提供了一个目录或子目录中的所有文件路径,但不是每个文件中第一个文件的路径。

QDir rootFolder("/root");
QStringList list;
QDirIterator dirIter(rootFolder.absolutePath(), QDir::AllEntries | QDir::NoSymLinks | 
QDir::NoDotAndDotDot, QDirIterator::Subdirectories);

while(dirIter.hasNext())
{
    dirIter.next();
    if(QFileInfo(dirIter.filePath()).isFile())
    {
        if(QFileInfo(dirIter.filePath()).suffix() == "txt")
        {
            qDebug()<<"File Path: " <<dirIter.filePath();

            list.append(dirIter.next());
            qDebug()<<"List: " <<list;
        }
    }
} 

【问题讨论】:

    标签: c++ qt qt5


    【解决方案1】:

    dirIter.next() 已经返回下一个值! 问题是,您在 while 循环之后跳过了第一项。

    编辑:如果你只想要第一个文件名,你可以这样做:

    QDir rootFolder("/Users/chris/Downloads");
    rootFolder.setSorting(QDir::Name);
    QStringList list;
    QDirIterator dirIter(rootFolder.absolutePath(), QStringList() << "*.txt", QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
    
    QStringList directoryList;
    
    while(dirIter.hasNext())
    {
        QString filename = dirIter.next();
        QFileInfo info(filename);
    
        if(directoryList.contains(info.absolutePath()))
        {
            continue;
        }
    
        qDebug()<<"File Path: " << info.absoluteFilePath();
        list.append(filename);
        directoryList.append(info.absolutePath());
    }
    
    qDebug()<< "List: " << list;
    

    【讨论】:

    • 谢谢你的回答,但这并没有给我文件夹中第一个文件的路径,而是所有文件的路径。
    【解决方案2】:

    请考虑使用 file1.txt 作为过滤器在 root 上递归迭代

    示例#:

    QDirIterator it("/home/root", QStringList() << "file1.txt", QDir::NoFilter, QDirIterator::Subdirectories);
    while (it.hasNext())
    {
        qDebug() << it.next();
    }
    

    这将直接打印类似的调试消息

    /Root/SubDir1/file1.txt
    /Root/SubDir3/SubSubDir1/file1.txt
    /Root/SubDir4/SubSubDir2/file1.txt
    

    阅读文档了解更多信息:

    https://doc.qt.io/qt-5/qdiriterator.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2016-01-31
      相关资源
      最近更新 更多