参考qt的书籍demo,做练习
目录和文件相关操作:
QCoreApplication类 主要处理获取app所在目录,路径,app名称,lib库路径等。
QFile类 主要实现文件拷贝,校验存在,删除,重命名,移动到回收站等。
QFileInfo类 获取文件必要信息,比如绝对路径,文件名,路径,大小,创建时间,最后修改时间等属性
QDir类 获取操作系统的一些目录路径 比如根目录,临时目录,home目录,分区,当前目录(可以设置)等。 目录的增删改查(递归删除目录) 路径,名称,遍历目录,遍历文件等
QTemporaryDir 在特定目录下创建临时文件夹,默认系统临时目录
QTemporaryFile 在特定目录下创建临时文件,默认系统临时目录
QFileSystemWatcher 跟踪文件或目录的创建、修改、删除等操作
借助折叠式容器QtoolBox,显示和管理一组相关的小部件(widget)实现。
1:基础:借助QFileDialog打开文件或者目录
//选择一个文件 文件名显示在文件区
//QFileDialog 有一系列静态函数 可以打开一个文件,多个文件,保存文件,目录选择对话框等。
void Dialog::on_pbn_openfile_clicked()
{
QString qDir = QDir::homePath();
QString aFile = QFileDialog::getOpenFileName(this,"打开一个文件",qDir,"所有文件(*.*)");
ui->le_filename->setText(aFile);
}
//选择一个目录 文件名显示在目录区
void Dialog::on_pbn_opendir_clicked()
{
QString qDir = QDir::homePath(); //借助qdir设置一个默认目录
QString aDir=QFileDialog::getExistingDirectory(this,"选择一个目录",qDir,QFileDialog::ShowDirsOnly);
ui->le_dirname->setText(aDir);
}
2:QCoreApplication类相关测试
//当前可执行文件所在的目录路径
void Dialog::on_pbn_app_path_clicked()
{
QString str = QCoreApplication::applicationFilePath();
ui->te_Displaylog->append("当前可执行文件所在路径:"+str);
}
void Dialog::on_pbn_app_dir_clicked()
{
QString str = QCoreApplication::applicationDirPath();
ui->te_Displaylog->append("当前可执行文件所在目录:"+str);
}
void Dialog::on_pbn_app_name_clicked()
{
QString str = QCoreApplication::applicationName();
ui->te_Displaylog->append("当前可执行文件名称:"+str);
//这里会触发applicationNameChanged 这个信号 配合使用
QCoreApplication::setApplicationName("myapp_test");
ui->te_Displaylog->append("修改后可执行文件名称:"+QCoreApplication::applicationName());
}
void Dialog::on_pbn_applib_dir_clicked()
{
//可以通过对应接口设置和删除
QStringList str_list = QCoreApplication::libraryPaths();
QString display = "相关依赖lib路径有: \n ";
foreach(const QString &str , str_list)
{
display += str;
display += "\n ";
}
ui->te_Displaylog->append(display);
}
void Dialog::on_pbn_appversion_clicked()
{
//需要先设置再获取 这里可以迭代开发用
QCoreApplication::setApplicationVersion("1.0.0");
QString ver = QCoreApplication::applicationVersion();
ui->te_Displaylog->append("当前可执行文件版本:"+ver);
}
//这里也是设置后生效 设置所属组织或者域名
void Dialog::on_pbn_app_org_clicked()
{
QCoreApplication::setOrganizationName("我公司!");
QCoreApplication::setOrganizationDomain("wogongsi.com");
ui->te_Displaylog->append("所属公司:"+QCoreApplication::organizationName());
ui->te_Displaylog->append("所属域名:"+QCoreApplication::organizationDomain());
//每个继承 QObject类都有 objectName属性
// this->setObjectName("XXX");
ui->te_Displaylog->append("object:"+this->objectName());
}
//除此之外,其他一些公用的函数 比如事件相关的。
void Dialog::on_pbn_app_exit_clicked()
{
QCoreApplication::exit();
}
验证结果如下:
3:QFile类的相关操作,操作文件
这类没涉及文件的读写,只是增删改查等。
//这里文件的相关操作需要基于已经选择的文件
void Dialog::on_pbn_file_exist_clicked()
{
QString file_name = ui->le_filename->text();
if(QFile::exists(file_name))
{
ui->te_Displaylog->append("QFile静态校验文件存在:"+file_name);
}else
{
ui->te_Displaylog->append("QFile静态校验文件不存在:"+file_name);
}
}
void Dialog::on_pbn_pfile_exit_clicked()
{
QString file_name = ui->le_filename->text();
QFile file(file_name);
if(file.exists())
{
ui->te_Displaylog->append("QFile成员校验文件存在:"+file_name);
}else
{
ui->te_Displaylog->append("QFile成员校验文件不存在:"+file_name);
}
}
void Dialog::on_pbn_file_copy_clicked()
{
QString file_name = ui->le_filename->text();
QFileInfo file_info(file_name); //借助QFileInfo 构造拷贝后文件名
QString dst_file_name =file_info.path()+"/"+file_info.baseName()+"_copy."+file_info.suffix();
display_to_ui(QFile::copy(file_name, dst_file_name), "QFile静态拷贝文件", dst_file_name);
}
void Dialog::on_pbn_pfile_copy_clicked()
{
QString file_name = ui->le_filename->text();
QFileInfo file_info(file_name); //借助QFileInfo 构造拷贝后文件名
QString dst_file_name =file_info.path()+"/"+file_info.baseName()+"_copy."+file_info.suffix();
QFile file(dst_file_name);
display_to_ui(file.copy(dst_file_name), "QFile成员拷贝文件", dst_file_name);
}
void Dialog::on_pbn_file_del_clicked()
{
QString file_name = ui->le_filename->text();
if(QFile::exists(file_name))
{
display_to_ui(QFile::remove(file_name), "QFile静态删除文件", file_name);
}else
{
display_to_ui(false, "文件不存在, QFile静态删除文件", file_name);
}
}
void Dialog::on_pbn_pfile_del_clicked()
{
QString file_name = ui->le_filename->text();
QFile file(file_name);
if(file.exists())
{
display_to_ui(file.remove(), "QFile成员删除文件", file_name);
}else
{
display_to_ui(false, "文件不存在, QFile成员删除文件", file_name);
}
}
void Dialog::on_pbn_file_rename_clicked()
{
QString file_name = ui->le_filename->text();
QFileInfo file_info(file_name); //借助QFileInfo 构造拷贝后文件名
QString dst_file_name =file_info.path()+"/"+file_info.baseName()+"_rename."+file_info.suffix();
display_to_ui(QFile::rename(file_name, dst_file_name), "QFile静态重命名文件", dst_file_name);
}
void Dialog::on_pbn_pfile_rename_clicked()
{
QString file_name = ui->le_filename->text();
QFileInfo file_info(file_name); //借助QFileInfo 构造拷贝后文件名
QString dst_file_name =file_info.path()+"/"+file_info.baseName()+"_rename."+file_info.suffix();
QFile file(file_name);
display_to_ui(file.rename(dst_file_name), "QFile成员重命名文件", dst_file_name);
}
void Dialog::on_pbn_file_trash_clicked()
{
QString file_name = ui->le_filename->text();
display_to_ui(false, "当前qt版本过低,可以用QFile::moveToTrash(),", file_name);
}
void Dialog::on_pbn_pfile_trash_clicked()
{
QString file_name = ui->le_filename->text();
display_to_ui(false, "当前qt版本过低,可以用file.moveToTrash(),", file_name);
}
void Dialog::display_to_ui(bool flag, QString str, QString filename)
{
if(flag)
{
ui->te_Displaylog->append(str+"成功,目标文件名:"+filename);
}else
{
ui->te_Displaylog->append(str+"失败,目标文件名:"+filename);
}
}
4:QFileinfo类相关操作
void Dialog::display_qfileinfo(QString data, QString str)
{
ui->te_Displaylog->append("QFileinfo操作 "+data+" :"+str);
}
//这里简单这样实现, 可以封装类等让代码更规范
//文件的各种属性 所属组 操作时间 等都可以通过QFileInfo
static QFileInfo g_file_info;
void Dialog::on_pbn_finfo_get_clicked()
{
//基于选择的文件创建一个QFileInfo对象
QString filename = ui->le_filename->text();
g_file_info.setFile(filename);
if(g_file_info.exists())
{
ui->te_Displaylog->append("获取QFileInfo成功。");
}else
{
ui->te_Displaylog->append("获取QFileInfo失败,请检查。");
}
}
void Dialog::on_pbn_finfo_abspath_clicked()
{
display_qfileinfo("获取绝对路径", g_file_info.absoluteFilePath());
}
void Dialog::on_pbn_finfo_path_clicked()
{
display_qfileinfo("获取路径(可能相对路径)", g_file_info.filePath());
}
void Dialog::on_pbn_finfo_absdir_clicked()
{
display_qfileinfo("获取绝对目录", g_file_info.absolutePath());
}
void Dialog::on_pbn_finfo_dir_clicked()
{
//也可以转成qdir处理
display_qfileinfo("获取目录(可能相对路径)", g_file_info.path());
}
void Dialog::on_pbn_finfo_filename_clicked()
{
display_qfileinfo("获取文件名", g_file_info.fileName());
}
void Dialog::on_pbn_finfo_size_clicked()
{
display_qfileinfo("获取文件大小", QString::number(g_file_info.size()));
}
void Dialog::on_pbn_finfo_allbasename_clicked()
{
display_qfileinfo("获取完整基本文件名(无后缀)", g_file_info.completeBaseName());
}
void Dialog::on_pbn_finfo_basename_clicked()
{
display_qfileinfo("获取基本文件名(无后缀)", g_file_info.baseName());
}
void Dialog::on_pbn_finfo_allsuffix_clicked()
{
display_qfileinfo("获取文件完整后缀", g_file_info.completeSuffix());
}
void Dialog::on_pbn_finfo__siffix_clicked()
{
display_qfileinfo("获取文件后缀", g_file_info.suffix());
}
void Dialog::on_pbn_finfo_isdir_clicked()
{
display_qfileinfo("是否是个文件夹", g_file_info.isDir()?"true":"false");
}
void Dialog::on_pbn_finfo_isfile_clicked()
{
display_qfileinfo("是否是个文件", g_file_info.isFile()?"true":"false");
}
void Dialog::on_pbn_finfo_isExec_clicked()
{
display_qfileinfo("是否可执行", g_file_info.isExecutable()?"true":"false");
}
#include <QDateTime>
void Dialog::on_pbn_finfo_createtime_clicked()
{
display_qfileinfo("文件创建时间", g_file_info.birthTime().toString("yyyy-MM-dd hh:mm:ss"));
}
void Dialog::on_pbn_finfo_modtime_clicked()
{
display_qfileinfo("文件最后修改时间", g_file_info.lastModified().toString("yyyy-MM-dd hh:mm:ss"));
}
void Dialog::on_pbn_finfo_readtime_clicked()
{
display_qfileinfo("文件最后读时间", g_file_info.lastRead().toString("yyyy-MM-dd hh:mm:ss"));
}
5:QDir类操作:目录相关操作
//qDir主要处理目录 也可以处理文件 一般获取目录,遍历目录,增删改目录时用
void Dialog::on_pbn_dir_rootpath_clicked()
{
//同样可以用成员 先返回qDir对象再去处理
ui->te_Displaylog->append("根目录为:"+QDir::rootPath());
}
void Dialog::on_pbn_dir_temppath_clicked()
{
ui->te_Displaylog->append("临时目录为:"+QDir::tempPath());
}
void Dialog::on_pbn_dir_homepath_clicked()
{
ui->te_Displaylog->append("根目录为:"+QDir::homePath());
}
//QFile::Permissions
void Dialog::on_pbn_dir_drives_clicked()
{
QFileInfoList list = QDir::drives();
QString display = "驱动盘为:";
foreach(const QFileInfo &info, list)
{
display += info.path() + " "; //info.permissions(); //是文件权限相关的处理 QFile::Permissions
}
ui->te_Displaylog->append(display);
}
void Dialog::on_pbn_dir_curpath_clicked()
{
ui->te_Displaylog->append("当前工作目录:"+QDir::currentPath());
}
void Dialog::on_pbn_dir_setpath_clicked()
{
bool flag = QDir::setCurrent("C:/test/currpath"); //虚构的目录 设置不成功
QString dir = ui->le_dirname->text();
flag = QDir::setCurrent(dir);
ui->te_Displaylog->append("重新设置工作目录:"+ QString(flag ?"true":"false"));
ui->te_Displaylog->append("重设后当前工作目录:"+QDir::currentPath());
}
//
void Dialog::on_pbn_dir_adddir_clicked()
{
QDir qdir(ui->le_dirname->text());
QString dirname = "create_dirname";
if(qdir.mkdir(dirname))
{
ui->te_Displaylog->append("创建目录成功:"+ui->le_dirname->text()+"/"+dirname);
}else
{
ui->te_Displaylog->append("创建目录失败:"+ui->le_dirname->text()+"/"+dirname);
}
}
//可以删除文件或者目录
void Dialog::on_pbn_dir_deldir_clicked()
{
QString filename = ui->le_filename->text();
QString dirname = ui->le_dirname->text();
QDir adir;
//这里测试时
ui->te_Displaylog->append(filename +" 删除 "+ QString((adir.remove(filename))?"成功":"失败"));
ui->te_Displaylog->append(dirname +" 删除 "+ QString((adir.rmdir(dirname)?"成功":"失败")));
//adir.rmpath()递归删除目录和子目录
}
//修改dir识别路径
void Dialog::on_pbn_dir_changedir_clicked()
{
QDir adir;
adir.setPath(ui->le_filename->text());
ui->te_Displaylog->append("当前dir路径:"+adir.path());
adir.setPath(ui->le_dirname->text());
ui->te_Displaylog->append("修改后dir路径:"+adir.path()+" 文件夹名称:"+adir.dirName()+" 路径"+adir.dirName());
}
//递归删除文件夹
void Dialog::on_pbn_dir_deldg_clicked()
{
QDir adir;
adir.setPath(ui->le_dirname->text());
//adir指定了路径 filePath指定文件名 把路径和文件名结合起来了
ui->te_Displaylog->append("文件路径:"+adir.filePath("123.txt")); //查找指定文件或者目录的路径
ui->te_Displaylog->append("递归删除文件夹测试:"+QString(adir.removeRecursively()?"true":"false"));
}
//用qdir对文件或者文件夹进行重命名测试
void Dialog::on_pbn_dir_rename_clicked()
{
QString filename = ui->le_filename->text();
QString dirname = ui->le_dirname->text();
QString file_rename = QFileInfo(filename).path()+"/"+QFileInfo(filename).baseName() +"_rename"+"."+QFileInfo(filename).suffix(); //只是演示 应该借助QFileinfo 对文件名进行处理
QString dir_rename = dirname + "_rename";
// QDir(dirname).cdUp(); //跳到父目录
QDir adir;
ui->te_Displaylog->append(filename+"重命名文件 "+ QString((adir.rename(filename, file_rename))?"成功":"失败"));
ui->te_Displaylog->append(dirname+"重命名目录 "+ QString((adir.rename(dirname, dir_rename))?"成功":"失败"));
}
//操作文件路径
void Dialog::on_pbn_dir_filepath_clicked()
{
QDir adir;
ui->te_Displaylog->append("qdir获取文件路径:"+adir.filePath(ui->le_filename->text())); //查找指定文件或者目录的路径
}
void Dialog::on_pbn_dir_absfilepath_clicked()
{
QDir adir;
ui->te_Displaylog->append("qdir获取文件路径:"+adir.absoluteFilePath(ui->le_filename->text())); //绝对路径
}
void Dialog::on_pbn_dir_canonicalpath_clicked()
{
QDir adir(ui->le_filename->text());
ui->te_Displaylog->append("qdir获取文件路径:"+adir.canonicalPath()); //规则路径
}
//主要研究目录对应的相关路径
void Dialog::on_pbn_dir_dirpath_clicked()
{
QDir adir("E:/Users/DELL/Desktop/新建文件夹/../../");
ui->te_Displaylog->append("路径:"+adir.path());
adir.cdUp();
ui->te_Displaylog->append("父路径:"+adir.path());
}
void Dialog::on_pbn_dir_absdirpath_clicked()
{
QDir adir("E:/Users/DELL/Desktop/新建文件夹/../../");
ui->te_Displaylog->append("相对根目录绝对路径:"+adir.absolutePath());
// adir.absoluteFilePath("file"); //遍历目录下文件使用
adir.cdUp();
ui->te_Displaylog->append("父路径:"+adir.absolutePath());
}
//规则路径
void Dialog::on_pbn_dir_cannonicalpath_clicked()
{
QDir adir("E:/Users/DELL/Desktop/新建文件夹/../新建文件夹/");
ui->te_Displaylog->append("相对根目录绝对路径:"+adir.canonicalPath()); //如果链接目录解析实际目录?
adir.cdUp();
ui->te_Displaylog->append("父路径:"+adir.canonicalPath());
}
void Dialog::on_pbn_dir_dirname_clicked()
{
QDir adir(ui->le_dirname->text());
ui->te_Displaylog->append("目录名为:"+adir.dirName());
}
//遍历目录下的所有目录
void Dialog::on_pbn_dir_dirlist_clicked()
{
QDir adir(ui->le_dirname->text());
QStringList list = adir.entryList(QDir::Dirs); //可以过滤目录 文件 读权限 写权限 执行权限等
QString display = "遍历所有的目录:";
foreach(const QString &str, list)
{
display += str + " ";
}
ui->te_Displaylog->append(display);
}
//遍历目录下的所有文件
void Dialog::on_pbn_dir_filelist_clicked()
{
QDir adir(ui->le_dirname->text());
//可以排序
QStringList list = adir.entryList(QDir::Files, QDir::Time); //可以过滤目录 文件 读权限 写权限 执行权限等
QString display = "遍历所有的文件:";
foreach(const QString &str, list)
{
display += adir.absoluteFilePath(str) + " ";
}
ui->te_Displaylog->append(display);
}
静态函数运行结果:
成员函数QDir操作文件:
QDir操作目录:
6:QTemporaryDir和QTemporaryFile创建临时目录或者文件
查看对应的目录,确实有目录或者文件生成。
//创建临时目录或者临时文件
void Dialog::on_pbn_ls_dir_clicked()
{
ui->te_Displaylog->append("当前系统临时目录为:"+QDir::tempPath());
}
#include <QTemporaryDir>
#include <QTemporaryFile>
#include <QThread>
//没有指定目录 就是在系统默认临时目录下创建
void Dialog::on_pbn_ls_tempdir_create_clicked()
{
QTemporaryDir adir;
adir.setAutoRemove(true);
ui->te_Displaylog->append("创建临时目录:"+adir.path());
QTemporaryFile afile;
afile.setAutoRemove(true);
afile.open();
afile.write("123456", 7);
QThread::sleep(5);
ui->te_Displaylog->append("创建临时文件:"+afile.fileName()+"文件大小:"+afile.size());
afile.close();
}
//可以看到在对应目录下创建了临时目录或者文件 文件设置不自动删除 所以没删除
void Dialog::on_pbn_ls_onedir_create_clicked()
{
QString temp_file = "temp_file.tmp";
QString temp_dir = "temp_dir";
QTemporaryDir adir(ui->le_dirname->text() +"/"+temp_dir);
adir.setAutoRemove(true);
ui->te_Displaylog->append("特定目录下创建临时目录:"+adir.path());
QTemporaryFile afile(ui->le_dirname->text() +"/"+temp_file);
afile.setAutoRemove(false);
// afile.autoRemove();
afile.open();
ui->te_Displaylog->append("特定目录下创建临时文件:"+afile.fileName());
QThread::sleep(5);
afile.close();
}
void Dialog::on_pbn_ls_curdir_create_clicked()
{
QString temp_file = "temp_file.tmp";
QString temp_dir = "temp_dir";
QTemporaryDir adir(temp_dir);
adir.setAutoRemove(true);
ui->te_Displaylog->append("当前工作目录下创建临时目录:"+adir.path());
QTemporaryFile afile(temp_file);
afile.setAutoRemove(false);
// afile.autoRemove();
afile.open();
ui->te_Displaylog->append("当前工作目录下创建临时文件:"+afile.fileName());
QThread::sleep(5);
afile.close();
}
7:QFileSystemWatcher监视文件或者目录的变化
#include <QFileSystemWatcher>
//监视文件或者目录 可以监视多个 可以增加监视 删除监视
QFileSystemWatcher g_file_dir_watch;
bool g_flag = false;
void Dialog::on_pbn_watcher_addfile_clicked()
{
if(!g_flag)
{
connect(&g_file_dir_watch,&QFileSystemWatcher::directoryChanged, this,&Dialog::do_directoryChanged); //directoryChanged
connect(&g_file_dir_watch,&QFileSystemWatcher::fileChanged, this,&Dialog::do_fileChanged); //fileChanged
g_flag = true;
}
g_file_dir_watch.addPath(ui->le_filename->text());
ui->te_Displaylog->append("添加监视文件:"+ui->le_filename->text());
}
void Dialog::on_pbn_watcher_adddir_clicked()
{
g_file_dir_watch.addPath(ui->le_dirname->text());
ui->te_Displaylog->append("添加监视目录:"+ui->le_dirname->text());
}
void Dialog::on_pbn_watcher_gets_clicked()
{
QStringList list = g_file_dir_watch.directories();
QString display = "获取已经监视的目录:";
foreach(const QString &str, list)
{
display += str;
}
ui->te_Displaylog->append(display);
}
void Dialog::on_pbn_watcher_getfiles_clicked()
{
QStringList list = g_file_dir_watch.files();
QString display = "获取已经监视的文件:";
foreach(const QString &str, list)
{
display += str;
}
ui->te_Displaylog->append(display);
}
void Dialog::on_pbn_watcher_delfile_clicked()
{
g_file_dir_watch.removePath(ui->le_filename->text());
ui->te_Displaylog->append("移除监视文件:"+ui->le_filename->text());
}
void Dialog::on_pbn_watcher_deldir_clicked()
{
g_file_dir_watch.removePath(ui->le_dirname->text());
ui->te_Displaylog->append("移除监视目录:"+ui->le_dirname->text());
}
void Dialog::do_directoryChanged(const QString &path)
{
ui->te_Displaylog->append(path +"目录发生变化,触发事件");
}
void Dialog::do_fileChanged(const QString &path)
{
ui->te_Displaylog->append(path +"文件发生变化,触发事件");
}
void Dialog::on_pbn_watcher_delall_clicked()
{
// g_file_dir_watch.disconnect();
disconnect(&g_file_dir_watch);
}