版权声明:最终版权归YBAidam所有 https://blog.csdn.net/Aidam_Bo/article/details/85258347
前言
本节内容主要包括磁盘容量检测、磁盘内指定或特定文件的操作
话不多说,先上效果图
共分为两个部分,第一部分是检测磁盘容量,第二部分是筛选磁盘内指定文件(test.txt)或特定文件(.txt / .png类型文件)
获取磁盘容量关键函数:【fileapi.h】 GetDiskFreeSpaceEx()
void DiskSend::GetDiskSpace(QString strDisk, double& dTotalBytes, double& dFreeBytes)
{
LPCWSTR lpcwstrDriver = (LPCWSTR)strDisk.utf16();
ULARGE_INTEGER lFreeBytesAvailable, lTotalBytesTemp, lTotalFreeBytes;
if (!GetDiskFreeSpaceEx(lpcwstrDriver, &lFreeBytesAvailable, &lTotalBytesTemp, &lTotalFreeBytes))
{
QMessageBox::warning(0, "Warning", "Acquire Disk Space Failed !");
dTotalBytes = -1;
dFreeBytes = -1;
return;
}
//unit : GB
dTotalBytes = lTotalBytesTemp.QuadPart / 1024.0 / 1024 / 1024;
dFreeBytes = lTotalFreeBytes.QuadPart / 1024.0 / 1024 / 1024;
ui.totalLabel->setText(QString::number(dTotalBytes, 'f', 3));//总计:xxGB
ui.freeLabel->setText(QString::number(dFreeBytes, 'f', 3));//剩余可用: xxGB
}
一、磁盘容量检测
该模块细分三个子模块
(1)通过改变QCommboBox indexcahnged信号槽,来获取对应磁盘总容量和所剩可用容量
定义QcommBox信号槽,获取磁盘String
connect(ui.comboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotDiskChanged(const QString&)));
(2)通过设置定时器,每隔十秒检测所有磁盘容量并展示出来
定义定时器,每隔10检测设备所有磁盘一次
connect(m_timer, SIGNAL(timeout()), this, SLOT(slotDiskChanged()));
(3)通过UDP发送该设备所有磁盘信息
QByteArray datagram;
QDataStream out(&datagram, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_5);
out << /*QDateTime::currentDateTime() << */dTotalBytes << dFreeBytes;
//qDebug() << QDateTime::currentDateTime();
QHostAddress address;
address.setAddress("192.168.1.67");
udpSocket->writeDatagram(datagram, address, 5555);
QThread::sleep(1);
二、筛选磁盘内特定文件
- 遍历所有磁盘
- 遍历每个磁盘所有文件夹,直至文件夹没有子节点(即文件)
注:此时我们找的是指定文件(test.txt)
根据前缀fname <test> 来遍历查找 sfiles.baseName() ;
void DiskSend::findSpecialFile(QString strDir, QStringList fileName,QString fname)
{
QDir curdir(strDir);
curdir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
QFileInfoList curdirlist = curdir.entryInfoList();
foreach(QFileInfo sfiles, curdirlist)
{
QString sfilesname = sfiles.fileName();
if (sfiles.isDir() == true)
{
QString strFileName = sfiles.filePath();
findSpecialFile(strFileName, fileName,fname);
}
if (sfiles.isFile() == true)
{
QString base = sfiles.baseName() ;
if (fname.contains(base,Qt::CaseInsensitive))
{
sfileNamePath snew;
snew.strFileName = sfiles.fileName();
snew.strFilePath = sfiles.filePath();
g_sfnp.append(snew);
ui.lineEdit_2->setText(snew.strFilePath);
}
}
}
//return s;
}
三、筛选磁盘内指定文件
注:此时我们找的是特定文件(.txt),所有 .txt 类型文件
根据后缀fileName <*.txt> 来遍历查找 QString ext = "*." + sfiles.suffix();
void DiskSend::findSpecialFile(QString strDir, QStringList fileName,QString fname)
{
QDir curdir(strDir);
curdir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
QFileInfoList curdirlist = curdir.entryInfoList();
foreach(QFileInfo sfiles, curdirlist)
{
QString sfilesname = sfiles.fileName();
if (sfiles.isDir() == true)
{
QString strFileName = sfiles.filePath();
findSpecialFile(strFileName, fileName,fname);
}
if (sfiles.isFile() == true)
{
QString ext = "*." + sfiles.suffix();
if (fileName.contains(ext ,Qt::CaseInsensitive))
{
sfileNamePath snew;
snew.strFileName = sfiles.fileName();
snew.strFilePath = sfiles.filePath();
g_sfnp.append(snew);
ui.lineEdit_2->setText(snew.strFilePath);
}
}
}
//return s;
}
总结
文件路径 :fileInfo.filePath();
文件全名称:fileInfo.fileName();
文件前缀:fileInfo.baseName();
文件后缀:fileInfo.suffix();
文件是否存在:fileInfo.exists();
文件大小:fileInfo.size();
是否是文件:fileInfo.isFile();
是否是目录:fileInfo.isDir();
是否是连接符:fileinfo.isSymLink();