一、文件大小及路径获取
得到一个文件的大小和所在目录,代码如下:
#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); //显示当前目录下的所有文件
}
运行结果如图所示: