1. 程式人生 > >Qt總結之一:遍歷資料夾和檔案目錄,並過濾和獲取檔案資訊、字尾名、字首名(一)

Qt總結之一:遍歷資料夾和檔案目錄,並過濾和獲取檔案資訊、字尾名、字首名(一)

一、採用遞迴和QDir實現資料夾下所有檔案遍歷的方法

#include <QDir>
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;
    bool bIsDir;
    do{
           QFileInfo fileInfo = list.at(i);
           if(fileInfo.fileName()=="."|fileInfo.fileName()=="..")
           {
                i++;
                continue;
           }

           bIsDir = fileInfo.isDir();
           if (bIsDir)
           {
               nFiles++;                //對檔案屬性進行處理
           //fileInfo.size(),fileInfo.fileName(),fileInfo.path()
           FindFile(fileInfo.filePath());
           }
           else
           {
               nFiles++;
           }
           i++;
    }
    while(i<list.size());
}

二、QT獲取資料夾下所有檔案數目及名字  

path=QFileDialog::getExistingDirectory(NULL, tr("選擇資料夾"),"D:\\",QFileDialog::ShowDirsOnly);
        QDir *dir=new QDir(path);
        QStringList filter;
        //filter<<"*.dat";
        //dir->setNameFilters(filter);
        QList<QFileInfo> *fileInfo=new QList<QFileInfo>(dir->entryInfoList(filter));

註釋掉的兩行是用來檔案過濾用的,如果你要指定檔案字尾名,這樣寫filter<<"*.dat"  就好了,如果要指定多個字尾名,這樣寫filter<<"*.dat"<<"*.txt"就行了

檔案數目:fileInfo->count();

檔名稱:fileInfo->at(i).fileName();

檔案路徑(包含檔名):fileInfo->at(i).filePath();

三、Qt遍歷目錄獲取檔案資訊

QFileInfo
獲取檔案資訊:檔名稱,路徑,大小,建立時間,修改時間,許可權等
使用
路徑:
UNIX: /home/dipper/file1
Windows: C://dipper//file1

建構函式:
QFileInfo fileInfo(path);
QFileInfo fileInfo;
fileInfo.setFile(path);

exists(): 判斷檔案是否存在
size(): 獲取檔案大小

檔案型別:
isFile(), isDir(), isSymLink()

symLinkTarget(): 返回符號連結的檔案

注意:
UNIX和Windows(快捷方式)對符號連結處理不一樣
UNIX: size()返回連結的目標檔案的大小
Windows: size()返回連結檔案本身的大小

#ifdef Q_OS_UNIX

QFileInfo info1("/home/bob/bin/untabify");
info1.isSymLink();          // returns true
info1.absoluteFilePath();   // returns "/home/bob/bin/untabify"
info1.size();               // returns 56201
info1.symLinkTarget();      // returns "/opt/pretty++/bin/untabify"

QFileInfo info2(info1.symLinkTarget());
info1.isSymLink();          // returns false
info1.absoluteFilePath();   // returns "/opt/pretty++/bin/untabify"
info1.size();               // returns 56201

#endif
#ifdef Q_OS_WIN

QFileInfo info1("C://Documents and Settings//Bob//untabify.lnk");
info1.isSymLink();          // returns true
info1.absoluteFilePath();   // returns "C:/Documents and Settings/Bob/untabify.lnk"
info1.size();               // returns 743
info1.symLinkTarget();      // returns "C:/Pretty++/untabify"

QFileInfo info2(info1.symLinkTarget());
info1.isSymLink();          // returns false
info1.absoluteFilePath();   // returns "C:/Pretty++/untabify"
info1.size();               // returns 63942

#endif

path(): 返回檔案路徑
fileName(): 返回檔名稱

QFileInfo fileInfo("/home/dipper/xyz.tar.gz");
fileInfo.path(); // returns "/home/dipper"
fileInfo.fileName(); // returns "xyz.tar.gz"
fileInfo.baseName(); // returns "xyz"
fileInfo.completeBaseName(); // returns "xyz.tar"
fileInfo.suffix();   // returns "gz"
fileInfo.completeSuffix(); // returns "tar.gz"

日期相關:
created(): 建立時間
lastModified(): 最近修改時間
lastRead(): 最近讀時間

許可權:
isReadable(), isWritable(), isExecutable()

所有者:
ower(), owerId(), group(), groupId(), permissions(), 
permission(QFile::Permissions permissions)

dir():  返回父目錄
下面三個都返回"~/examples/191697"
QFileInfo fileInfo1("~/examples/191697/.");
QFileInfo fileInfo2("~/examples/191697/..");
QFileInfo fileInfo3("~/examples/191697/main.cpp");

下面三個都返回"."
QFileInfo fileInfo4(".");
QFileInfo fileInfo5("..");
QFileInfo fileInfo6("main.cpp");

相對路徑和絕對路徑
QString absolute = "/local/bin";
QString relative = "local/bin";
QFileInfo absFile(absolute);
QFileInfo relFile(relative);

QDir::setCurrent(QDir::rootPath());
// absFile and relFile now point to the same file

QDir::setCurrent("/tmp");
// absFile now points to "/local/bin",
// while relFile points to "/tmp/local/bin"

QDir 顯示檔案系統目錄

例項:檔案瀏覽器

 

//fileviewer.h
#ifndef FILEVIEWER_H
#define FILEVIEWER_H

#include <QtGui>

class FileViewer : public QDialog        // file information dialogs widget
{
Q_OBJECT
public:
FileViewer(QWidget *parent=0);
~FileViewer();
public:
QLineEdit* currDir;
QListWidget* fileListWidget;

public:
void showFileInfoList(QFileInfoList list);

public slots:
void showDir(QListWidgetItem * item);
void showFiles(QDir dir);
void showFiles();
};

#endif // FILEVIEWER_H
//fileviewer.cpp
#include "fileviewer.h"

FileViewer::FileViewer(QWidget *parent)
: QDialog(parent)
{  
   setWindowTitle(tr("File Viewer"));

   currDir = new QLineEdit;
   currDir->setText("c://");
   //currDir->setReadOnly(true);

   fileListWidget = new QListWidget;

   QVBoxLayout *vbLayout = new QVBoxLayout(this);
   vbLayout->addWidget(currDir);
   vbLayout->addWidget(fileListWidget);

   connect(currDir, SIGNAL(returnPressed()),
   this, SLOT(showFiles()));

   connect(fileListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
   this, SLOT(showDir(QListWidgetItem *)));

   QString root = "c://";
   QDir rootDir(root);

   QStringList strings;
   strings << "*" ;
   QFileInfoList list = rootDir.entryInfoList(strings);
   showFileInfoList(list);
}

FileViewer::~FileViewer()
{

}

//顯示檔案資訊列表
void FileViewer::showFileInfoList(QFileInfoList list)
{
   fileListWidget->clear();
   for(int i=0; i<list.count(); i++)
   {
      QFileInfo tmpFileInfo = list.at(i);
      if((tmpFileInfo.isDir()))
      {
         QIcon icon(":/images/dir.png");
         QString fileName = tmpFileInfo.fileName();
         QListWidgetItem *tmp = new QListWidgetItem(icon, fileName); //在列表上顯示圖示和名稱
         fileListWidget->addItem(tmp);
      }
      else if(tmpFileInfo.isFile())
      {
         QIcon icon(":/images/file.png");
         QString fileName = tmpFileInfo.fileName();
         QListWidgetItem *tmp = new QListWidgetItem (icon, fileName);
         fileListWidget->addItem(tmp);
      }
   }
}

void FileViewer::showDir(QListWidgetItem * item)
{
QString str = item->text();
QDir dir;
dir.setPath(currDir->text()); //設定目錄
dir.cd(str); //切換到另一個目錄
currDir->setText(dir.absolutePath());
showFiles(dir);
}

void FileViewer::showFiles(QDir dir)
{
QStringList strings;
strings << "*" ;
QFileInfoList list = dir.entryInfoList(strings,   //檔名稱過濾器,"*", "*.tar.gz"
QDir::AllEntries,  //檔案屬性過濾器,目錄,檔案,讀寫
QDir::DirsFirst  //排序方式,名稱,修改時間,大小,目錄優先
);
showFileInfoList(list);
}

void FileViewer::showFiles()
{
QDir dir(currDir->text());
showFiles(dir);
}
//main.cpp
#include "fileviewer.h"
#include <QApplication>

int main( int argc, char **argv )
{
   QFont font("ZYSong18030",12);
   QApplication::setFont(font);

   QApplication app(argc, argv);
   QTranslator translator;
   translator.load("fileviewer_zh","..");
   app.installTranslator(&translator);

   FileViewer *fileviewer = new FileViewer;
   fileviewer->show();
   return app.exec();
}

絕對路徑
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")

dirName(): 返回目錄名稱
QDir("Documents/Letters/Applications").dirName() // "Applications"
QDir().dirName()                                 // "."

切換目錄:cd(str), cdUp()

建立,修改,刪除:mkdir(), rename(), rmdir()

獲取目錄裡面的檔案,目錄等
count(): 返回條目的數量
QStringList list = dir.entryList();
QFileInfoList fileInfoList = dir.entryInfoList();

靜態函式
Dir        Qstring
current(), currentPath()
home(),    homePath()
root(),    rootPath()
temp(),    tempPath()

QDir dir("example");
if (!dir.exists())
qWarning("Cannot find the example directory");
//使用靜態函式:QFile::exists("example");

遍歷目錄,讀寫檔案

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

四、獲取檔案的(完整)字尾名和(完整)字首名

獲取檔案字首名

QFileInfo fi("/tmp/archive.tar.gz");
QString base= fi.baseName(); // base = "archive"

獲取檔案的完整字首名

 QFileInfo fi("/tmp/archive.tar.gz");
 QString base= fi.completeBaseName(); // base = "archive.tar"

獲取檔案字尾名

QFileInfo fi("/tmp/archive.tar.gz");
QString ext= fi.suffix();  // ext = "gz"

獲取檔案的完整字尾名

QFileInfo fi("/tmp/archive.tar.gz");
QString ext= fi.completeSuffix(); // ext = "tar.gz"