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

news2024/9/22 7:40:34

目录

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.coloradmin.cn/o/1487860.html

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

相关文章

Docker镜像导出/导入

Docker镜像导出/导入 一、前言 在实际操作中&#xff0c;为了便于docker镜像环境和服务配置的迁移&#xff0c;我们有时需要将已在测试环境主机上完成一系列配置的docker镜像或运行中的容器镜像导出&#xff0c;并传输到生产或其他目标环境主机上运行。为此&#xff0c;本文主…

python+Django+Neo4j中医药知识图谱与智能问答平台

文章目录 项目地址基础准备正式运行 项目地址 https://github.com/ZhChessOvO/ZeLanChao_KGQA 基础准备 请确保您的电脑有以下环境&#xff1a;python3&#xff0c;neo4j 在安装目录下进入cmd&#xff0c;输入指令“pip install -r requirement.txt”,安装需要的python库 打…

【C++精简版回顾】18.文件操作

1.文件操作头文件 2.操作文件所用到的函数 1.文件io 1.头文件 #include<fstream> 2.打开文件 &#xff08;1&#xff09;函数名 文件对象.open &#xff08;2&#xff09;函数参数 /* ios::out 可读 ios::in 可…

大模型之SORA技术学习

文章目录 sora的技术原理文字生成视频过程sora的技术优势量大质优的视频预训练库算力多&#xff0c;采样步骤多&#xff0c;更精细。GPT解释力更强&#xff0c;提示词(Prompt&#xff09;表现更好 使用场景参考 Sora改变AI认知方式&#xff0c;开启走向【世界模拟器】的史诗级的…

拉线位移编码器出现问题从哪里下手找原因

拉线位移编码器出现问题从哪里下手找原因 1、如果因接线错误导致位移编码器无信号或输出信号波动较大时&#xff0c;应按照说明书检查信号线是否连接正确。 2、拉线位移编码器的供电电压为5V&#xff0c;如果供电电压过低或过高也会引起信号线的传输&#xff0c;应检查输入电…

leetcode - 2095. Delete the Middle Node of a Linked List

Description You are given the head of a linked list. Delete the middle node, and return the head of the modified linked list. The middle node of a linked list of size n is the ⌊n / 2⌋th node from the start using 0-based indexing, where ⌊x⌋ denotes th…

【小白友好】LeetCode 打家劫舍 III

https://leetcode.cn/problems/house-robber-iii/description/ 前言 建议还是先看看动态规划的基础题再看这个。动态规划是不刷题&#xff0c;自己100%想不出来的。 基础题&#xff1a; 最大子数组和乘积最大子数组最长递增子序列 最大升序子数组和 小白想法 现在我们想遍…

使用query请求数据出现500的报错

我在写项目的时候遇到了一个问题&#xff0c;就是在存商品id的时候我将它使用了JSON.stringify的格式转换了&#xff01;&#xff01;&#xff01;于是便爆出了500这个错误&#xff01;&#xff01;&#xff01; 我将JSON.stringify的格式去除之后&#xff0c;它就正常显示了&…

Linux - 进程控制

1、进程创建 1.1、fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程&#xff1b; #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进…

java常见的8种数据结构

一、线性结构&#xff1a;数组、链表、哈希表&#xff1b;队列、栈 1.数组&#xff1a; 数组是有序元素的序列&#xff0c;在内存中的分配是连续的&#xff0c;数组会为存储的元素都分配一个下标&#xff08;索引&#xff09;&#xff0c;此下标是一个自增连续的&#xff0c;访…

万村乐数字乡村系统开源代码:革命性引领,助推乡村振兴新篇章

如今&#xff0c;国际社会普遍认为信息化、数字化已是重大且不可逆转的发展趋势&#xff0c;如何让广大农村地区充分分享到这个发展带来的红利&#xff0c;从而提升农村的经济活力&#xff0c;确保村民生活质量不断优化&#xff0c;已然成为我们需要认真研究并积极解决的重大议…

美国法院命令NSO集团将其间谍软件代码交给WhatsApp

Techreport网站消息&#xff0c;近日&#xff0c;美国法院下令要求以色列间谍软件开发商NSO集团将其Pegasus间谍软件的代码交给WhatsApp。 2019年&#xff0c;NSO集团利用WhatsApp的安全漏洞对1400名用户进行了为期两周的监视。同年&#xff0c;WhatsApp向该公司提起了法律诉讼…

k8s初始化错误

报错详情&#xff1a; you can check the kubelet logs for further clues by running: ‘journalctl -u kubelet’ Alternatively, there might be issues with your Kubernetes configuration files or maybe the necessary ports are not opened. Check the status of …

应用方案丨D317大电流可调稳压电路

1、 概述&#xff1a; D317是一款三端可调正稳压器集成电路&#xff0c;其输出电压范围是1.2V至37V&#xff0c;负载电流最大为1.5A。它的使用非常简单&#xff0c;仅需两个外接电阻来设置输出电压。此外&#xff0c;它的电压线性度和负载调整率也比标准的固定稳压器好。D317内…

通过联合部署DDoS高防和WAF提升网站防护能力

如果您的网站遭受的攻击既有流量型攻击&#xff0c;又混杂精巧的Web应用层攻击时&#xff08;例如SQL注入、跨站脚本攻击、命令注入等&#xff09;时&#xff0c;推荐您组合使用阿里云DDoS高防和Web 应用防火墙 WAF&#xff08;Web Application Firewall&#xff09;&#xff0…

【MySQL】事务管理 -- 详解

一、前言 CURD 不加控制&#xff0c;会有什么问题&#xff1f; CURD 满足什么属性&#xff0c;能解决上述问题&#xff1f; 买票的过程得是原子的。买票应该不能受互相的影响。买完票应该要永久有效。买前和买后都要是确定的状态。 什么是事务&#xff1f; 事务就是一组 DML…

2024-03-03 c++

&#x1f338; MFC进度条控件 | Progress Control 1。新建MFC项目&#xff08;基于对话框、静态库&#xff09; 2。添加控件&#xff0c;删除初始的3个多余控件 加1个progress control&#xff0c;修改其marquee为true&#xff0c;添加变量&#xff1a;变量名为test_progress。…

乡村教师的待遇会比城里的好吗

每次提到乡村教师&#xff0c;我们总会联想到那些坚守在偏远山区的教育工作者&#xff0c;他们默默无闻&#xff0c;为了乡村的孩子们奉献着自己的青春和热血。那么&#xff0c;乡村教师的待遇究竟如何呢&#xff1f;是否真的如外界所传闻的那般&#xff0c;比城里的教师还要好…

ip https证书360元买一年送一月

随着互联网的发展&#xff0c;不论是用户还是开发者&#xff0c;都越来越重视互联网环境的安全性。IP https证书是一种网络安全协议&#xff0c;用于保护网络通信的安全性和机密性。IP https数字证书是CA认证机构为只有公网IP地址&#xff0c;没有域名的站点颁发的数字证书&…