QT学习:目录操作与文件系统

一、文件大小及路径获取

得到一个文件的大小和所在目录,代码如下:

#include <QCoreApplication>
#include <QStringList>
#include <QDir>
#include <QtDebug>
qint64 du(const QString &path)
{
    QDir dir(path);
    qint64 size = 0;
    foreach(QFileInfo fileInfo,dir.entryInfoList(QDir::Files))
    {
        size += fileInfo.size();
    }
    foreach(QString subDir,dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
    {
        size += du(path+QDir::separator()+subDir);
    }

    char unit ='B';
    qint64 curSize=size;
    if(curSize>1024)
    {
        curSize/=1024;
        unit ='K';
        if(curSize>1024)
        {
            curSize/=1024;
            unit ='M';
            if(curSize>1024)
            {
                curSize/=1024;
                unit ='G';
            }
        }
    }
    qDebug()<<curSize<<unit<<"\t"<<qPrintable(path)<<endl;
    return size;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QStringList args = a.arguments();
    QString path;
    if(args.count()>1)
    {
        path = args[1];
    }
    else
    {
        path = QDir::currentPath();
    }
    qDebug()<<path<<endl;
    du(path);
    return a.exec();
}

二、文件系统浏览

创建工程FileView.pro,具体代码及步骤如下如下:
(1)在头文件“fileview.h”中,类FileView继承自QDialog类,具体代码如下:

#include <QDialog> 
#include <QLineEdit> 
#include <QListWidget> 
#include <QVBoxLayout> 
#include <QDir> 
#include <QListWidgetItem> 
#include <QFileInfoList> 
class FileView : public QDialog 
{ 
Q_OBJECT 
public: 
FileView(QWidget *parent=0,Qt::WindowFlags f=0); 
~FileView(); 
void showFileInfoList(QFileInfoList list); 
public slots: 
void slotShow(QDir dir); 
void slotDirShow(QListWidgetItem * item); 
private: 
QLineEdit *fileLineEdit; 
QListWidget *fileListWidget; 
QVBoxLayout *mainLayout; 
};

(2)源文件“fileview.cpp”的具体代码如下:

#include "fileview.h" 
#include <QStringList> 
#include <QIcon> 
FileView::FileView(QWidget *parent,Qt::WindowFlags f) 
: QDialog(parent,f) 
{ 
setWindowTitle(tr("File View")); 
fileLineEdit = new QLineEdit(tr("/")); 
fileListWidget = new QListWidget; 
mainLayout = new QVBoxLayout(this); 
mainLayout->addWidget(fileLineEdit); 
mainLayout->addWidget(fileListWidget); 
connect(fileLineEdit,SIGNAL(returnPressed()),this,SLOT(slotShow (QDir 
)));
connect(fileListWidget,SIGNAL(itemDoubleClicked (QListWidgetItem*)), 
this,SLOT(slotDirShow(QListWidgetItem*))); 
QString root = "/"; 
QDir rootDir(root); 
QStringList string; 
string << "*"; 
QFileInfoList list=rootDir.entryInfoList(string); 
showFileInfoList(list); 
}

槽函数slotShow()实现了显示目录dir下的所有文件,具体内容如下:

void FileView::slotShow(QDir dir) 
{ 
QStringList string; 
string<<"*"; 
QFileInfoList list=dir.entryInfoList(string,QDir::AllEntries,QDir:: DirsFirst); 
//QDir的entry InfoList()方法是按照某 种过滤方式获得目录下的文件列表 
showFileInfoList(list); 
}

其中,QDir::Filter定义了一系列的过滤方式,如图所示:
在这里插入图片描述
QDir::SortFlag定义了一系列排序方式,具体如图所示:
在这里插入图片描述
函数showFileInfoList()实现了用户可以双击浏览器中显示的目录进入下一级目录,或单击“…”返回 上一级目录,顶部的编辑框显示当前所在的目录路径,列表中显示该目录下的所有文件。其具体代码 如下:

void FileView::showFileInfoList(QFileInfoList list) 
{ 
fileListWidget->clear(); 
//首先清空列表控件 
for(unsigned int i=0;i<list.count();i++) 
{ 
QFileInfo tmpFileInfo=list.at(i); 
if(tmpFileInfo.isDir()) 
{ 
QIcon icon("dir.png"); 
QString fileName = tmpFileInfo.fileName(); 
QListWidgetItem *tmp = new QListWidgetItem(icon,fileName); 
fileListWidget->addItem(tmp); 
}
else if(tmpFileInfo.isFile()) 
{ 
QIcon icon("file.png"); 
QString fileName=tmpFileInfo.fileName(); 
QListWidgetItem *tmp = new QListWidgetItem(icon,fileName); 
fileListWidget->addItem(tmp); 
} 
} 
}

槽函数slotDirShow()根据用户的选择显示下一级目录的所有文件。其具体实现代码如下:

void FileView::slotDirShow(QListWidgetItem * item) 
{ 
QString str=item->text(); //将下一级的目录名保存在str中 
QDir dir; //定义一个QDir对象 
dir.setPath(fileLineEdit->text()); //设置QDir对象的路径为当前目录路径 
dir.cd(str) //根据下一级目录名重新设置QDir对象的路径 
fileLineEdit->setText(dir.absolutePath()); 
slotShow(dir); //显示当前目录下的所有文件 
}

运行结果如图所示:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值