【QT】C/C++ 文件属性设置(隐藏、只读、加密等)方法和程序示例

目录

1文件属性设置

1.1 GetFileAttributes 获取文件属性函数的返回值

1.2 SetFileAttributes 设置文件属性函数

2 文件属性设置示例

1文件属性设置

在MSDN中,文件总共有15种属性,根据磁盘的分区格式不同,文件的属性也会不同。
需要包含头文件:#include <windows.h> 

1.1 GetFileAttributes 获取文件属性函数的返回值

返回字段
返回值
属性类型
FILE_ATTRIBUTE_READONLY
1
只读
FILE_ATTRIBUTE_HIDDEN
2
隐藏
FILE_ATTRIBUTE_SYSTEM
4
系统
FILE_ATTRIBUTE_DIRECTORY
16
目录
FILE_ATTRIBUTE_ARCHIVE
32
存档
FILE_ATTRIBUTE_DEVICE
64
保留
FILE_ATTRIBUTE_NORMAL
128
正常
FILE_ATTRIBUTE_TEMPORARY
256
临时
FILE_ATTRIBUTE_SPARSE_FILE
512
稀疏文件
FILE_ATTRIBUTE_REPARSE_POINT
1024
超链接或快捷方式
FILE_ATTRIBUTE_COMPRESSED
2048
压缩
FILE_ATTRIBUTE_OFFLINE
4096
脱机
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
8192
索引
FILE_ATTRIBUTE_ENCRYPTED
16384
加密
FILE_ATTRIBUTE_VIRTUAL
65536
虚拟
        “只读”、“隐藏”、“系统”、“存档”为Windows系统中文件的四种基本属性。compressed,content_indexed,encrypted只存在于NTFS分区中。
        文件去掉全部属性后(四种基本属性),将自动标记为normal。同时具有system和hidden属性的文件会在系统中彻底隐形,这也是病毒常用的伎俩。
        commpressed和encrypted不能共存。默认情况下文件都有content_indexed属性

1.2 SetFileAttributes 设置文件属性函数

设置文件属性: SetFileAttributes(文件名, 属性值)
  • SetFileAttributes(文件名, FILE_ATTRIBUTE_READONLY); // 设定为只读
  • SetFileAttributes(文件名, FILE_ATTRIBUTE_HIDDEN );       //设定为隐藏
  • SetFileAttributes(文件名, FILE_ATTRIBUTE_SYSTEM);      //设定为系统
  • SetFileAttributes(文件名, FILE_ATTRIBUTE_ARCHIVE);   //设定为保存
  • SetFileAttributes(文件名, FILE_ATTRIBUTE_NORMAL);     //设定为一般 (取消前四种属性)
设定二种以上的属性:
* 设定为只读 + 隐藏
  • SetFileAttributes(文件名, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN);
* 设定为只读 + 隐藏 + 系统 + 保存
  • SetFileAttributes(文件名, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN _
| FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE);
* 取消所有设定
  • SetFileAttributes(文件名, FILE_ATTRIBUTE_NORMAL);

2 文件属性设置示例

        下面程序演示了在Windows系统和Linux系统下设置文件属性,windows系统已得到验证,Linux系统仅提供一个思路,待验证。
1.设置文件隐藏属性
2.示例说明:获取当前的时间(时间格式:"yyyy-mm-dd hh"),根据当前时间查找目录下以时间命名的文件
3.文件初始显示如下
4.查询功能
        查询按钮信号槽如下:
void ExamDisplayFrm::on_Bt_QueryVehLog_clicked()
{
    QString strDate = ui->dateEdit_startDate->date().toString("yyyy-MM-dd");
    QString strTime = ui->timeEdit_startTime->time().toString("hh");
    QString strQueryDateTime = strDate+"#"+strTime;


//    QDir fileDir =  QDir("../SlLog/SLCarLog/" + QString("%1号车日志").arg(QString::number(mVehID)));
//    QString vehLogDir = fileDir.absolutePath();
//    qDebug()<<"===========vehLogDir"<<vehLogDir;
//    //创建 QDirIterator 对象并设置过滤器为只显示文件(不包括子目录)
//    QDirIterator iterator(vehLogDir, QDir::Files | QDir::NoDotAndDotDot);
//    while (iterator.hasNext()) {
//        QString filePath = iterator.next();
//        qDebug() << "已成功隐藏文件:" << filePath;
//    }

    //恢复上次被隐藏的文件
    if(lstHideFilePath.size()!=0)
    {
        QStringListIterator strListIterator(lstHideFilePath);
        while (strListIterator.hasNext())
        {
            QString filePath = strListIterator.next();
#ifdef Q_OS_WIN
            SetFileAttributes((LPCWSTR)filePath.unicode(), FILE_ATTRIBUTE_NORMAL);
#else //将隐藏的文件修改为可显示文件
            QString oldName = filePath;
            QFileInfo file(oldName);
            if(!file.exists()){
                qDebug() << QString("file not exist:%1").arg(oldName);;
            }
            QFileInfo fileInfo(oldName);
            QString path = fileInfo.absolutePath();
            QString fileName = fileInfo.fileName();
            QString newName = "";
            if (fileName.left(1) == ".")//第一个字符不为“.”
                newName = fileName.remove(0, 1); // 新文件名;
            else
                newName = fileName;
            newName = path + "/" + newName;
            bool ok = QFile::rename(oldName, newName);
            if(ok){
               qDebug() << "File renamed successfully!";
            }
            else
            {
               qDebug() << "Failed to rename file!";
            }
#endif
        }
    }


    QStringList filters;
    filters.append(QString("*.txt"));
    QDir fileDir = QDir("../SlLog/SLCarLog/" + QString("%1号车日志").arg(QString::number(mVehID)));
    fileDir.setNameFilters(filters);  //设置文件名称过滤器,只为filters格式
    QString currPath;
    int vehSize = static_cast<int>(fileDir.count());
    for(int i=0;i<vehSize;i++){
        currPath =  fileDir.absolutePath() + "/" + fileDir[i];
        if(fileDir[i].contains(strQueryDateTime)==false){//非查询范围内的文件名称
#ifdef Q_OS_WIN
            SetFileAttributes((LPCWSTR)currPath.unicode(),FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN);        // 设置隐藏文件夹
#else   //修改文件名,设置为隐藏文件
            QString oldName = currPath;
            QFileInfo file(oldName);
            if(!file.exists()){
                qDebug() << QString("file not exist:%1").arg(oldName);;
            }
            QFileInfo fileInfo(oldName);
            QString filePath = fileInfo.absolutePath();
            QString fileName = fileInfo.fileName();
            QString newName = "";
            if (fileDir[i].left(1) != ".")//第一个字符不为“.”
                newName = "."+fileDir[i]; // 新文件名
            else
                newName = fileDir[i];
            newName = filePath + "/" + newName;
            bool ok = QFile::rename(oldName, newName);
            if(ok){
               qDebug() << "File renamed successfully!";
               currPath =  newName;
            }
            else
            {
               qDebug() << "Failed to rename file!";
            }
#endif
            lstHideFilePath.append(currPath);//记录上次被隐藏的文件
        }
    }
    showDir(fileDir);
}

例如查询2024年02月29日 16时的文件时:

4.恢复功能

        恢复功能即是将隐藏的文件恢复显示,恢复按钮信号槽如下:

void ExamDisplayFrm::on_Bt_RecoverHideFile_clicked()
{
    if(lstHideFilePath.size()!=0)
    {
        QStringListIterator strListIterator(lstHideFilePath);
        while (strListIterator.hasNext())
        {
            QString filePath = strListIterator.next();
#ifdef Q_OS_WIN
            SetFileAttributes((LPCWSTR)filePath.unicode(), FILE_ATTRIBUTE_NORMAL);
#else //将隐藏的文件修改为可显示文件
            QString oldName = filePath;
            QFileInfo file(oldName);
            if(!file.exists()){
                qDebug() << QString("file not exist:%1").arg(oldName);;
            }
            QFileInfo fileInfo(oldName);
            QString path = fileInfo.absolutePath();
            QString fileName = fileInfo.fileName();
            QString newName = "";
            if (fileName.left(1) == ".")//第一个字符不为“.”
                newName = fileName.remove(0, 1); // 新文件名;
            else
                newName = fileName;
            newName = path + "/" + newName;
            bool ok = QFile::rename(oldName, newName);
            if(ok){
                qDebug() << "File renamed successfully!";
            }
            else
            {
                qDebug() << "Failed to rename file!";
            }
#endif
        }
    }


    QStringList filters;
    filters.append(QString("*.txt"));
    QDir fileDir = QDir("../SlLog/SLCarLog/" + QString("%1号车日志").arg(QString::number(mVehID)));
    fileDir.setNameFilters(filters);  //设置文件名称过滤器,只为filters格式
    showDir(fileDir);
}

        显示被隐藏的文件:

5.打开外部程序函数:

        该函数可自动弹出目录框

void ExamDisplayFrm::showDir(QDir fileDir)
{
    QString strLogPath = "start " + fileDir.absolutePath();
    QProcess process(this);
    process.setProgram("cmd");//设置命令形式
    QStringList argument;
    argument << "/c" << strLogPath;//在cmd命令中,/c代表“执行完命令后返回”。它表示在执行完命令后,程序将返回到调用cmd的环境中。使用/c参数可以避免程序在执行过长命令时处于等待状态而呈现假死的现象。
    process.setArguments(argument);
    process.start();
    process.waitForStarted(); //等待程序启动
    process.waitForFinished();//等待程序关闭
}

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

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

相关文章

buildadmin 入口文件index.php的代码解析

buildadmin的入口文件和一般的tp8的入口文件是不一样的&#xff0c;参考这个入口文件的写法&#xff0c;我们可以大至了解&#xff0c; 为什么&#xff0c;前端的 index.html 和 php的入口文件同在 public 的目录下&#xff0c;而可以不冲突 先看一下 buildadmin的入口文件 &l…

机器学习周报第31周

目录 一、论文阅读1.1 论文标题1.2 论文摘要1.3 论文背景1.4 提出的系统&#xff1a;MAER1.4.1 基于Asyncio的预处理1.4.2 多模态信号下的情感识别1.4.3 针对情感不匹配情况的自适应融合 一、论文阅读 1.1 论文标题 Beyond superficial emotion recognition: Modality-adapti…

opencv实现图像的融合

实现图像的融合并且输出一张jpg格式的照片。 先显示一个彩色图的照片 然后我以彩色方式读取1.png&#xff0c;以灰度图方式读取3.png这张图片&#xff0c;并且用两个窗口独立地去显示(我后来发现不能把灰度图和彩色图相融合) 然后实现两个融合 #include <opencv2/highgu…

OJ:反转链表

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 思路 思路&#xff1a;直接有一个叫移除链表元素的oj&#xff0c;我们在那里因为不想再原链表上修改节点指向&#xff0c;那这个题我们能不能用那个思路呢&#xff0c;其实想一想先拷贝再改变&#xff0c;也挺麻烦的。所…

MySQL 使用 pt-archiver 删除数据

文章目录 前言1. 环境准备1.1 模拟造数1.2 工具安装 2. 删除数据2.1 批次删除表2.2 原理解析2.3 批处理思路 后记 前言 在线核心业务都会有日志表&#xff0c;随着业务持续运行&#xff0c;日志表每天都在增大&#xff0c;最后超过阈值触发空间使用率告警。DBA 处理空间告警时…

Vue开发实例(十一)用户列表的实现与操作

用户列表的实现与操作 一、创建用户页面和路由二、表格优化1、表头自定义2、表格滚动3、加入数据索引4、利用插槽自定义显示 三、功能1、查询功能3、增加4、删除5、修改 一、创建用户页面和路由 创建用户页面 在 src/components/Main 下创建文件夹user&#xff0c;创建文件Us…

java spring 02. AbstractApplicationContext

spring创建对象的顺序&#xff0c;先创建beanfactory&#xff0c;再会把xml文件读取到spring。 public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {//调用父类的构造方法super(p…

Django Web架构:全面掌握Django模型字段(上)

Django Web架构 全面掌握Django模型字段&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article…

【机器人最短路径规划问题(栅格地图)】基于蚁群算法求解

代码获取方式&#xff1a;QQ&#xff1a;491052175 或者 私聊博主获取 基于蚁群算法求解机器人最短路径规划问题的仿真结果 仿真结果 收敛曲线变化趋势 蚁群算法求解最优解的机器人运动路径 各代蚂蚁求解机器人最短路径的运动轨迹

二、TensorFlow结构分析(1)

目录 1、TF数据流图 1.1 TensorFlow结构分析 1.2 案例 2、图与TensorBoard 2.1 图结构 2.2 图相关操作 2.2.1 默认图 2.2.2 创建图 2.3 TensorBoard&#xff1a;可视化学习 2.3.1 数据序列化 - events文件 2.3.2 启动TensorBoard 2.4 OP 2.4.1 常见OP 2.4.2 指令…

20.图

图的基本概念 1.图的定义 由顶点和边组成的集合&#xff0c;G(V,E) 2.基本概念 邻接点&#xff1a; 对于无向图u v来说&#xff0c;uv互为邻接点 对于有向图u->v来说&#xff0c;v是u的邻接点&#xff0c;但u不是v的临界点 路径&#xff1a; 一个顶点到另一个顶点所经过的…

【漏洞复现】通天星CMSV6车载监控平台getImage任意文件读取漏洞

Nx01 产品简介 深圳市通天星科技有限公司&#xff0c;是一家以从事计算机、通信和其他电子设备制造业为主的企业。通天星车载视频监控平台软件拥有多种语言版本。应用于公交车车载视频监控、校车车载视频监控、大巴车车载视频监控、物流车载监控、油品运输车载监控、警车车载视…

【数据结构】_包装类与泛型

目录 1. 包装类 1.1 基本数据类型和对应的包装类 1.2 &#xff08;自动&#xff09;装箱和&#xff08;自动&#xff09;拆箱 1.2.1 装箱与拆箱 1.2.2 自动&#xff08;显式&#xff09;装箱与自动&#xff08;显式&#xff09;拆箱 1.3 valueOf()方法 2. 泛型类 2.1 泛…

bert 相似度任务训练完整版

任务 之前写了一个相似度任务的版本&#xff1a;bert 相似度任务训练简单版本,faiss 寻找相似 topk-CSDN博客 相似度用的是 0&#xff0c;1&#xff0c;相当于分类任务&#xff0c;现在我们相似度有评分&#xff0c;不再是 0,1 了&#xff0c;分数为 0-5&#xff0c;数字越大…

ChatGPT最新功能“Text To Speech (TTS,文本转语音)”详细解读!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

Windows环境MySQL全量备份+增量备份

一、环境准备 1.1.安装MySQL 在进行MySQL数据库备份和还原操作时&#xff0c;必须先提前安装好MySQL环境&#xff0c;且MySQL服务已成功开启 如果没有安装MySQL环境&#xff0c;可以参考博客&#xff1a;http://t.csdnimg.cn/h8bHl 如果已成功安装MySQL环境&#xff0c;打开…

Orbit 使用指南 02 | 在场景中生成原始对象| Isaac Sim | Omniverse

如是我闻&#xff1a; Orbit使用指南02将 深入探讨如何使用Python代码在Orbit中向场景生成各种对象&#xff08;或原始对象&#xff09;。一起探索如何生成地面平面、灯光、基本图形形状以及来自USD文件的网格。前置知识&#xff1a;如何生成空白场景&#xff0c;Orbit 使用指…

VUE实现Office文档在线编辑,支持doc/docx、xls/xlsx、ppt/pptx、pdf等

1.微软提供的在线Office预览&#xff08;只能预览&#xff0c;不能编辑&#xff09; https://view.officeapps.live.com/op/view.aspx?src服务器上文档地址&#xff08;http开头&#xff09; 2.国内在线Office方案&#xff1a; 腾讯文档、石墨文档、飞书 优势&#xff1a;跨…

paimon取消hive转filesystem

目录 概述实践关键配置spark sql 结束 概述 公司上一版本保留了 hive &#xff0c;此版优化升级后&#xff0c;取消 hive。 实践 关键配置 同步数据时&#xff0c;配置如下&#xff0c;将形成两个库 # ods库 CREATE CATALOG paimon WITH (type paimon,warehouse hdfs:///d…

CentOS配网报错:network is unreachable

常用命令&#xff1a; 打开&#xff1a; cd /etc/sysconfig/network-scripts/ 修改&#xff1a; vim ifcfg-ens33 打开修改&#xff1a; vim /etc/sysconfig/network-scripts/ifcfg-ens33 保存&#xff1a; 方法1&#xff1a;ESCZZ&#xff08;Z要大写&#xff09; 方…
最新文章