目录

1文件属性设置

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

1.2 SetFileAttributes 设置文件属性函数

2 文件属性设置示例

1文件属性设置

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

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(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();//等待程序关闭}