1. 需求
用户反应,电脑由于自身磁盘空间只有128G,由于软件执行一次任务,就要录视频记录,导致磁盘空间爆满,电脑卡,无法再次生成视频
2. 分析:当时软件没有写自动删除视频的代码导致的。
可以写一个检查电脑磁盘的函数,自动检测存放视频的目录。如果磁盘可用空间小于指定的大小,就自动删除早期的视频,如果没有早期的视频,就递归删除现有的视频,直到磁盘可用空间大于指定的大小,如果全部删除,还是小于指定大小,则弹窗提示用户,删除其余不用的文件。
有如下方案:
1. 每隔一段时间,自动检查一次磁盘空间
2. 每次用户执行任务,检查一遍磁盘空间
3. 解决方案
两种方案都没啥问题,我采用了第二种
代码如下:
void Camera::checkDiskSpace() {
if (getDiskSpace()) {
emit notifyDiskSpaceInsufficient();
// 磁盘空间小于阈值,则删除部分早期视频
QDir VideoDir = QDir(qApp->applicationDirPath() + VIDEO_PLAYBACK_PATH);
bool flag = false;
QDateTime today = QDateTime::currentDateTime();
for(QFileInfo fileInfo : VideoDir.entryInfoList()) {
if (fileInfo.fileName()=="." || fileInfo.fileName()=="..")
{
continue;
}
QDateTime date = fileInfo.lastModified();
uint filedate = date.toTime_t();
uint todayData = today.toTime_t();
uint ruler = todayData - filedate;
ruler /= (60 * 60 * 24);
//如果文件修改时间大于七天,清理文件及文件夹
//if (ruler > 7) {
flag = true;
if(fileInfo.isDir()) {
QDir dir(fileInfo.filePath());
dir.removeRecursively();
}
else {
QFile::remove(fileInfo.filePath());
}
if(!getDiskSpace()) {
break;
}
}
if (flag) {
WriteLog("由于磁盘可用空间小于视频存储阈值,已删除部分视频文件", "Camera");
}
}
}
bool Camera::getDiskSpace()
{
Q_D(Camera);
auto path = qApp->applicationDirPath();
auto storage = QStorageInfo(path);
storage.refresh();
auto availableSize = storage.bytesAvailable()/1024/1024/1024;
// 与指定空间的大小
auto needClean = availableSize < d->m_diskReserveSize;
return needClean;
}