#include <QCoreApplication>
#include <QDir>
#include <QStringList>
#include <QtDebug>
// 自定义函数实现获取目录下大小
qint64 GetDirFileInfoSizeFunc(const QString &qpath)
{
// QDir类专门用来操作路径名称或底层文件系统,可以使用相对或绝对路径来指向一个文件/目录
QDir qdirs(qpath);
qint64 qsize=0; // 存放目录占据空间
// QFileInfor类提供有关文件系统当中文件名称、路径(位置)、访问权限、文件类型等等信息
// entryInfoList函数获取过滤之后获得的文件名夹下面的文件信息列表
foreach(QFileInfo finfo,qdirs.entryInfoList(QDir::Files))
{
qsize=qsize+finfo.size();
}
// QDir::Dirs列出目录。QDir::separator()不列出文件系统当中的特殊文件
foreach(QString sDir,qdirs.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
{
qsize=qsize+GetDirFileInfoSizeFunc(qpath+QDir::separator()+sDir);
}
char uint='B';
qint64 currentdirsize=qsize;
if(currentdirsize>1024)
{
currentdirsize=currentdirsize/1024;
uint='K';
if(currentdirsize>1024)
{
currentdirsize=currentdirsize/1024;
uint='M';
if(currentdirsize>1024)
{
currentdirsize=currentdirsize/1024;
uint='G';
if(currentdirsize>1024)
{
currentdirsize=currentdirsize/1024;
uint='T';
}
}
}
}
qDebug()<<"目录占据空间为:"<<currentdirsize<<"\t"<<qPrintable(qpath);
return qsize;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 该字符串存储路径
QString strPath;
strPath=QDir::currentPath(); // 获取当前目录
qDebug()<<"当前目录为:"<<strPath<<endl;
// 调用此函数求目录占据空间的大小
GetDirFileInfoSizeFunc(strPath);
return a.exec();
}
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
resize(500,300);
setWindowTitle("QDir类综合控件应用");
filelistwidget = new QListWidget();
filelineedit = new QLineEdit("/");
glayout = new QVBoxLayout(this);
glayout->addWidget(filelineedit);
glayout->addWidget(filelistwidget);
//信号与槽函数的连接
connect(filelineedit,SIGNAL(returnPressed()),this,SLOT(dispdir(QDir)));
connect(filelistwidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,
SLOT(dispdirshow(QListWidgetItem*)));
QString root="/";
QDir rootDir(root);
QStringList strlist;
strlist<<"*";
// entryInfoList函数获取过滤之后获得的文件名夹下面的文件信息列表
QFileInfoList list=rootDir.entryInfoList(strlist);
//调用此函数来显示
dispfileinfolist(list);
}
Dialog::~Dialog()
{
}
void Dialog::dispfileinfolist(QFileInfoList list)//显示目录和文件所对应图标
{
filelistwidget->clear();
for (unsigned int i=0;i<list.count();i++)
{
QFileInfo tempfileinfo = list.at(i);
if(tempfileinfo.isDir())//判断是目录
{
QIcon ico("f:/connect.ico");
QString filename = tempfileinfo.fileName();
QListWidgetItem *temp=new QListWidgetItem(ico,filename);
filelistwidget->addItem(temp);
}
else if(tempfileinfo.isFile())//判断是文件
{
QIcon ico("f:/disconnect.ico");
QString filename=tempfileinfo.fileName();
QListWidgetItem *temp=new QListWidgetItem(ico,filename);
filelistwidget->addItem(temp);
}
}
}
void Dialog::dispdir(QDir dir)
{
QStringList strlist;
strlist<<"*";
QFileInfoList fileinfolist=dir.entryInfoList(strlist,QDir::AllEntries,QDir::DirsFirst);
dispfileinfolist(fileinfolist);
}
void Dialog::dispdirshow(QListWidgetItem *item)
{
QDir dir;
QString str = item->text();
dir.setPath(filelineedit->text());
dir.cd(str);
filelineedit->setText(dir.absolutePath());
dispdir(dir);
}
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QMainWindow>
#include <QListWidget>//列表框
#include <QLineEdit>//单行输入框
#include <QDir> //获取操作路径及底层文件系统
#include <QFileInfoList> //获取指定目录的基本数据信息
#include <QVBoxLayout> //垂直布局
#include <QGridLayout> //网格布局
#include <QStringList> //用于处理字符串列表。它提供了一种方便的方式来管理一组字符串,包括添加、删除、搜索、排序等操作
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QLineEdit *filelineedit;//显示所选泽目录名称
QListWidget * filelistwidget;//列表框,展示目录和文件
QVBoxLayout * glayout;//垂直布局
public:
void dispfileinfolist(QFileInfoList list);//显示目录和文件所对应图标
public slots:
void dispdir(QDir dir);
void dispdirshow(QListWidgetItem *item);
};
#endif // DIALOG_H