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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Open CASCADE学习|参数化球面的奇异性

参数曲面的奇异性是一个相对复杂的概念&#xff0c;它涉及到参数曲面的几何特性和参数化过程中的一些特殊情况。参数曲面通常用于描述三维空间中的复杂形状&#xff0c;通过参数方程将二维参数域映射到三维空间中。然而&#xff0c;在某些情况下&#xff0c;参数曲面可能会表现…

ROS2学习笔记三:话题Topic

目录 前言 1 话题简介 2 常用指令 3 RCLCPP实现实现话题 3.1 创建工作空间 3.2 代码编写 3.2.1 发布端编写 3.2.2 发布端编写 前言 ROS2中的一个重要概念是话题&#xff08;Topic&#xff09;。话题是一种通过发布者和订阅者之间进行异步通信的机制。发布者&#xff0…

TiDB 在全球头部物流企业计费管理系统的应用实践

本文介绍了某全球头部物流企业采用 TiDB 解决计费管理系统性能瓶颈的实践。原系统采用的云数据库受限于架构而无法水平扩展&#xff0c;导致高并发性能问题。该企业通过选择 TiDB&#xff0c;成功打破了性能瓶颈&#xff0c;实现了无缝水平扩展&#xff0c;降低了开发和运维负担…

SpringIOC之support模块GenericXmlApplicationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

内网穿透的应用-使用Docker部署开源建站工具—Halo,并实现个人博客公网访问

文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 本篇文章介绍如何在CentOS下使用D…

详解java中ArrayList

目录 前言 一、ArrayList是什么 二、ArrayList使用 1、ArrayList的构造 2 、ArrayList常见操作 3、 ArrayList的遍历 4、 ArrayList的扩容机制 三、来个练习 前言 当你看到这篇文章我觉得很好笑&#xff0c;因为我开始也不懂ArrayList现在轮到你了&#xff0c;嘻嘻嘻&am…

ChatGPT新出Team号 年付费

之前一直传的团队版ChatGPT终于来了&#xff0c;这个对拼单的比较合算。每人每月25美元&#xff0c;只能按年支付。 团队版比普通版多的权益有&#xff1a; ◈更多的GPT-4消息上限&#xff0c;三小时100次。 ◈可以创建与团队内部共享的GPTs。 ◈用于工作空间管理的管理员控…

【深度学习:视觉基础模型】视觉基础模型 (VFM) 解释

【深度学习&#xff1a;视觉基础模型】视觉基础模型 VFM 解释 了解视觉基础模型从 CNN 到 Transformer 的演变自我监督和适应能力 流行的视觉基础模型DINO&#xff08;自蒸馏&#xff0c;无标签&#xff09;SAM&#xff08;分段任意模型&#xff09;SegGPTMicrosofts Visual Ch…

PINN物理信息网络 | 物理信息神经网络PINN实例及其Python实现

基本介绍 物理信息神经网络是一种基于物理系统的神经网络模型。它的设计灵感来自于神经科学和量子力学&#xff0c;旨在利用物理系统的特性来处理和存储信息。 传统的神经网络使用数字或模拟电子组件作为基本单元进行计算和存储。而物理信息神经网络则使用物理系统中的元件来代…

制造企业实施WMS仓储管理系统后的变革与挑战

随着市场竞争的日益激烈&#xff0c;制造型企业对于提高生产效率和降低运营成本的需求愈发迫切。在这一背景下&#xff0c;WMS仓储管理系统解决方案逐渐成为制造业企业的必备工具。然而&#xff0c;实施WMS仓储管理系统不仅意味着企业将迎来一系列的变革&#xff0c;还将面临一…

【常用的简单功能及算法】拦截器 加盐算法 深克隆 时间日期格式化 加盐算法 sql分页算法 验证码

1.实现拦截器 Interceptor (以登录拦截器为例) 1.1 写一个登录拦截器普通类 实现HandlerInterceptor接口重写preHandle方法 //检验登录状态拦截器 //实现接口HandlerInterceptor 重写方法preHandle public class LoginInterceptor implements HandlerInterceptor {/** 该方…

新年烟花代码-html版

新年烟花代码 效果展示 代码 <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>2024新年快乐&#xff01;万事如意&#xff01;</title><meta name"viewport" content"width…

Java中的多线程

进程和线程的概念 进程是应用程序的执行实例有独立的内存空间和系统资源。 线程是进程中执行运算的最小单位&#xff0c;可完成一个独立的顺序控制流程 一。一个进程可以包含多个线程&#xff0c;每个线程都独立执行特定的任务&#xff0c; 是CPU调度和分派的基本单位。 多线…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑥

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“ax&#xff1a;”&#xff08;x为2、3或4&#xff09;&#xff1b;其中变量x、y均须为整型。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码进行测试…

开发知识点-RabbitMQ

RabbitMQ 下载与介绍权限了解消息状态rabbitmqctl命令与操作配置常见错误常见问题日志 poc-yaml-rabbitmq-default-password 下载与介绍 RabbitMQ是一个使用Erlang语言开发 开源的消息中间件项目&#xff08;Message Broker&#xff09;&#xff0c; 采用Mozilla Public Licen…

SpringBoot用MultipartFile.transferTo传递相对路径的问题

问题描述&#xff1a; 打算给自己的项目添加一个上传文件保存功能&#xff0c;于是我使用MultipartFile.transferTo()来完成这个功能&#xff0c;由于我的项目要部署到服务器&#xff0c;所以我使用了相对路径把上传的文件保存到当前项目的工作目录下&#xff0c;但是报错了&am…

如何在 Windows 中使用Copilot AI

Windows Copilot 是 Windows 中的一个新功能&#xff0c;它可以让你与一个智能助理进行对话&#xff0c;获取信息&#xff0c;执行任务&#xff0c;甚至创造内容。Windows Copilot 使用了 Bing Chat 的技术&#xff0c;它是一个基于 OpenAI 的 GPT-4 模型的聊天机器人。 目录 …

关于树结构的数据的权限控制的算法

树结构的权限控制分两种:1、逐层加载&#xff1b;2、一次性加载 一、逐层加载 涉及的表结构 表名 T_PLAN 表字段 字段类型 是否必 须字段 说明 ID VARCHAR2(50) Y 主键 PARENT_ID VARCHAR2(50) Y 父项节点ID&#xff0c;默认根节点的父节点ID’-1’ TREEPATH VA…

vue3的福音框架arco.design

前言&#xff1a; 在vue2于2023年底正式宣布不在维护&#xff0c;vue3使用越来越频繁的时刻&#xff0c;我们实现项目的辅助框架也越来越多。element, iview, antd 等经典框架继续风靡一时&#xff0c;不过也有很多好的框架&#xff0c;功能也强大&#xff0c;比如我们今天说的…

ISO 11519-2 开环低速 CAN 网络(10K~125Kbps)

ISO 11519-2 标准的物理框图如下图 可理解为一个低速开环 CAN 总线网络&#xff1b;CAN 开环总线网络允许总线最大长度为 1km;最高速度为 125Kbps;这里的两根线是独立的&#xff0c;每根线上串联一个 2.2kΩ 的电阻&#xff1b;节点就是不同的设备&#xff0c;连接到一个开环总…