qt初入门3:文件,目录,临时文件,监视相关demo

news2025/1/12 4:56:58

参考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);
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1374778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenCV学习笔记04】- 绘图功能

这是对于 OpenCV 官方文档的 GUI 功能的学习笔记。学习笔记中会记录官方给出的例子&#xff0c;也会给出自己根据官方的例子完成的更改代码&#xff0c;同样彩蛋的实现也会结合多个知识点一起实现一些小功能&#xff0c;来帮助我们对学会的知识点进行结合应用。 如果有喜欢我笔…

如何使用宝塔面板部署Inis博客并实现无公网ip环境远程访问

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

正则表达式、文件访问(Python实现)

一、主要目的&#xff1a; 1.了解正则表达式的基本概念和处理过程。 2.掌握使用正则表达式模块 Re 进行字符串处理的方法。 3.了解文件的基本概念和类型。 4.掌握在 Python 中访问文本文件的方法和步骤。 5.熟悉在 Python 中访问二进制文件的方法和步骤。 二、主要内容和结…

.NET开源、强大的Web报表统计系统

前言 今天分享一个.NET开源、强大的Web报表统计系统&#xff1a;CellReport。 项目官方介绍 CellReport 诞生的初衷是为了解决日常快速制作统计报表的需要。 CellReport 是一个为复杂统计报表为核心目标的制作、运行工具。你可以使用数据库、excel文件、api服务、已有报表等为…

【C++期末】酒店住宿信息管理系统(含easyX)

诚接计算机专业编程作业(C语言、C、Python、Java、HTML、JavaScript、Vue等)&#xff0c;如有需要请私信我&#xff0c;或者加我的企鹅号&#xff1a;1404293476 本文资源&#xff1a;https://download.csdn.net/download/weixin_47040861/88725363 目录 1.题目要求 2.实现效…

linux中出现不在 sudoers 文件中。此事将被报告的解决方法

出现如下提示gaokaoli 出现不在 sudoers 文件中。此事将被报告 一般是该用户 权限不够 既然知道权限不够可以添加到root用户组&#xff0c;获取权限即可 通过命令行添加到权限&#xff0c;发现还是不行 sudo usermod -g root gaokaoli 那就直接在配置文件中修改 通过执行vi…

需求跟踪矩阵的作用

需求跟踪矩阵对于嵌入式系统的整个生命周期至关重要。这种矩阵能够帮助确保产品的安全性并满足预设的质量标准。对于医疗、技术和工程等领域来说&#xff0c;需求追溯矩阵尤其关键。实际上&#xff0c;任何设定了目标和标准、并希望维护这些目标和标准的企业都能从这个经过实践…

ChatGPT提示词的高级技巧——解锁AI交互新境界

大家好我是在看&#xff0c;记录普通人学习探索AI之路。 这一讲我来介绍几种提示词的高级使用技巧。 1.拆解问题 对于一个一次性很难完整回答的大问题&#xff0c;我们可以将其拆解成若干子问题&#xff0c;再将这些问题逐步输入。 我们来看下面的例子&#xff1a; 2.迭代改…

Rough.js:创建手绘、草图外观的图形

Rough.js 是一个小型的(<9kB gzipped)图形库&#xff0c;它可以让你以草图、手绘风格进行绘制。 该库定义了绘制直线、曲线、圆弧、多边形、圆和椭圆的基元。它还支持绘制 SVG 路径。 Rough.js 可以同时处理 Canvas 和 SVG。 安装 从npm安装&#xff1a; npm install --s…

如何正确使用高速探头前端--probe head

目前市面上的高速有源探头种类丰富&#xff0c;使用灵活&#xff0c;如下图所示&#xff0c;结构多为放大器焊接前端的组合&#xff0c;以E2677B探头前端为例&#xff0c;其焊接前端电阻有三种选择&#xff0c;91ohm时可实现全带宽使用&#xff08;12GHz&#xff09;&#xff0…

nginx+keepalived双主模式双主热备

目录 一、双主模式原理 1. nginxkeepalived主备模式缺点 2. 主备模式和双主模式的区别 二、配置文件 1. nginx01的keepalived.conf 2. nginx02的keepalived.conf 3. 检测nginx存活脚本文件nginx_check.sh 三、测试准备 1. 启动nginx01、nginx02 2. 启动keepalived 3. 查看网卡信…

【【深入浅出了解静态时钟分析和时钟约束】】

深入浅出了解静态时钟分析和时钟约束 时序分析是什么&#xff1f; 我们提出一些特定的时序要求&#xff08;或者说是添加特定的时序约束&#xff09;&#xff0c;使用特定的时序模型&#xff0c;针对特定的电路进行分析。分析的最终结果是要求系统时序满足我们提出的要求。 这…

大文件分片上传,断点续传,秒传 示例(待更新...)

1.html代码 <template><div class="card content-box"><el-upload ref="upload" class="upload-demo" action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15":limit="1" :on-change=&quo…

【C++】手撕 list类(包含迭代器)

目录 1&#xff0c;list的介绍及使用 2&#xff0c;list_node 3&#xff0c;list_node() 3&#xff0c;list 4&#xff0c;list() 5&#xff0c;push_back(const T& x) 6&#xff0c;print() 7&#xff0c;_list_iterator 8&#xff0c;operator*() 9&#xff0c…

Qt QComboBox组合框控件

文章目录 1 属性和方法1.1 文本1.2 图标1.3 插入和删除1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的组合框是集按钮和下拉列表体的控件&#xff0c;&#xff0c;它占用的屏幕空间很小&#xff0c;对应的类是QComboBox 1 属性和方法 QComboBox有很多属性&#xff0c;完整的…

【福利】百度内容审核平台实战

文章目录 前言功能概述产品价格快速入门&#xff08;账号登录及资源领取、在线验证、编写示例程序&#xff09;实战演示1、首先创建一个应用2、引入百度的SDK3、测试用例百度内容审核-文本 200QPS百度内容审核-图像 50QPS 写在最后 前言 百度内容审核平台主要针对图像、文本、…

RT-Thread 中断管理

中断管理 什么是中断&#xff1f;简单的解释就是系统正在处理某一个正常事件&#xff0c;忽然被另一个需要马上处理的紧急事件打断&#xff0c;系统转而处理这个紧急事件&#xff0c;待处理完毕&#xff0c;再恢复运行刚才被打断的事件。 生活中&#xff0c;我们经常会遇到这…

开源C语言库Melon:数据恢复算法

本文讲述开源C语言库Melon中的里德所罗门纠错码的使用。 关于 Melon 库&#xff0c;这是一个开源的 C 语言库&#xff0c;它具有&#xff1a;开箱即用、无第三方依赖、安装部署简单、中英文文档齐全等优势。 Github repo 简介 里德所罗门编码是一种纠错码技术&#xff0c;…

C++ λ表达式

λ表达式提供了函数对象的另一种编程机制。 在 C 11 和更高版本中&#xff0c;Lambda 表达式&#xff08;通常称为 Lambda&#xff09;是一种在被调用的位置或作为参数传递给函数的位置定义匿名函数对象&#xff08;闭包&#xff09;的简便方法。 Lambda 通常用于封装传递给算法…

项目与工程的关系,是一个项目包含若干个工程还是一个工程包含若干个项目?

在项目管理和工程管理的领域里&#xff0c;项目&#xff08;Project&#xff09;和工程&#xff08;Engineering&#xff09;通常有不同的定义和关系&#xff0c;这取决于具体的行业和应用背景。但一般来说&#xff0c;项目和工程之间的关系可以这样理解&#xff1a; 项目包含工…