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