【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_WINSetFileAttributes((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); // 新文件名;elsenewName = 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_WINSetFileAttributes((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]; // 新文件名elsenewName = 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!";}
#endiflstHideFilePath.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_WINSetFileAttributes((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); // 新文件名;elsenewName = 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.hqwc.cn/news/511147.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

182基于matlab的半监督极限学习机进行聚类

基于matlab的半监督极限学习机进行聚类&#xff0c;基于流形正则化将 ELM 扩展用于半监督&#xff0c;三聚类结果可视化输出。程序已调通&#xff0c;可直接运行。 182matlab ELM 半监督学习 聚类 模式识别 (xiaohongshu.com)

2D/3D相机手眼标定总结

1. 九点标定 九点标定法的本质&#xff1a; 无需进行相机内参标定&#xff0c;只能识别x&#xff0c;y坐标&#xff0c;属于2D平面标定&#xff0c;在标定过程中z是未知的。 该算法的核心是仿射变换&#xff0c;即图像坐标系到机器人坐标系的2D仿射变换&#xff08;注意这里并不…

B084-SpringCloud-Zuul Config

目录 zuul系统架构和zuul的作用zuul网关实现配置映射路径过滤器 Config概述云端管理本地配置 zuul zuul是分布式和集群后前端统一访问入口 系统架构和zuul的作用 zuul把自己注册进eureka&#xff0c;然后可通过前端传来的服务名发现和访问对应的服务集群 为了预防zuul单点故…

C++:Vector的模拟实现

创作不易&#xff0c;感谢三连 &#xff01;&#xff01; 一&#xff0c;前言 在学习string类的时候&#xff0c;我们可能会发现遍历的话下标访问特别香&#xff0c;比迭代器用的舒服&#xff0c;但是下标其实只能是支持连续的空间&#xff0c;他的使用是非常具有局限性的&am…

Fisher矩阵与自然梯度法

文章目录 Fisher矩阵及自然梯度法Fisher矩阵自然梯度法总结参考链接 Fisher矩阵及自然梯度法 自然梯度法相比传统的梯度下降法具有以下优势&#xff1a; 更好的适应性&#xff1a;自然梯度法通过引入黎曼流形上的梯度概念&#xff0c;能够更好地适应参数空间的几何结构。这使…

如何本地安装gemma

目录 通过ollama开源软件来一键安装目前主流的大模型&#xff0c;支持的开源模型包括以下内容&#xff1a; https://github.com/ollama/ollama

基于pytorch的手写体识别

一、环境搭建 链接: python与深度学习——基础环境搭建 二、数据集准备 本次实验用的是MINIST数据集&#xff0c;利用MINIST数据集进行卷积神经网络的学习&#xff0c;就类似于学习单片机的点灯实验&#xff0c;学习一门机器语言输出hello world。MINIST数据集&#xff0c;可以…

【树】【异或】【深度优先】【DFS时间戳】2322. 从树中删除边的最小分数

作者推荐 【二分查找】【C算法】378. 有序矩阵中第 K 小的元素 涉及知识点 树 异或 DFS时间戳 LeetCode2322. 从树中删除边的最小分数 存在一棵无向连通树&#xff0c;树中有编号从 0 到 n - 1 的 n 个节点&#xff0c; 以及 n - 1 条边。 给你一个下标从 0 开始的整数数组…

京东商品优惠券API获取商品到手价

item_get_app-获得JD商品详情原数据 公共参数 请求地址: jd/item_get_app 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,i…

(十五)【Jmeter】取样器(Sampler)之HTTP请求

简述 操作路径如下: HTTP请求 (HTTP Sampler): 作用:模拟发送HTTP请求并获取响应。配置:设置URL、请求方法、请求参数等参数。使用场景:测试Web应用程序的HTTP接口性能。优点:支持多种HTTP方法和请求参数,适用于大多数Web应用程序测试。缺点:功能较为基础,对于复杂…

鸿蒙实战应用开发:【拨打电话】功能

概述 本示例通过输入电话&#xff0c;进行电话拨打&#xff0c;及电话相关信息的显示。 样例展示 涉及OpenHarmony技术特性 网络通信 基础信息 拨打电话 介绍 本示例使用call相关接口实现了拨打电话并显示电话相关信息的功能 效果预览 使用说明 1.输入电话号码后&#…

11. Nginx进阶-HTTPS

简介 基本概述 SSL SSL是安全套接层。 主要用于认证用户和服务器&#xff0c;确保数据发送到正确的客户机和服务器上。 SSL可以加密数据&#xff0c;防止数据中途被窃取。 SSL也可以维护数据的完整性&#xff0c;确保数据在传输过程中不被改变。 HTTPS HTTPS就是基于SSL来…