From 2627b690648b50b6b7ac9ffb8bbdfeb7eb5266b3 Mon Sep 17 00:00:00 2001 From: liyigang Date: Wed, 27 Dec 2023 17:45:00 +0800 Subject: [PATCH] fix: Copying a large number of empty files and folders on the USB drive, with incorrect progress bar statistics The reason for the inaccurate data statistics here is that we calculated the size of the directory as 4096, but in the write statistics of the USB drive, we calculated the size by reading and writing how many block blocks were written. The size of the directory and the 0kb file were calculated as a numerical value in the USB drive, which caused our own calculated values to not match. When modifying the statistics size, we are copying thread blocking statistics and then using our own statistics method. Log: Copying a large number of empty files and folders on the USB drive, with incorrect progress bar statistics Bug: https://pms.uniontech.com/bug-view-236707.html --- src/dfm-base/utils/filestatisticsjob.cpp | 8 +------- .../fileoperationutils/abstractworker.cpp | 13 +++++++++---- .../fileoperationutils/fileoperatebaseworker.cpp | 5 +++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/dfm-base/utils/filestatisticsjob.cpp b/src/dfm-base/utils/filestatisticsjob.cpp index 4e2027e876..8e977a6683 100644 --- a/src/dfm-base/utils/filestatisticsjob.cpp +++ b/src/dfm-base/utils/filestatisticsjob.cpp @@ -407,7 +407,7 @@ void FileStatisticsJob::setSizeInfo() { d->sizeInfo->fileCount = static_cast(d->filesCount); d->sizeInfo->totalSize = d->totalProgressSize; - d->sizeInfo->dirSize = d->sizeInfo->dirSize == 0 ? FileUtils::getMemoryPageSize() : d->sizeInfo->dirSize; + d->sizeInfo->dirSize = FileUtils::getMemoryPageSize(); } void FileStatisticsJob::statistcsOtherFileSystem() @@ -466,12 +466,6 @@ void FileStatisticsJob::statistcsOtherFileSystem() } if (info->isAttributes(OptInfoType::kIsDir)) { - if (d->sizeInfo->dirSize == 0) { - struct stat statInfo; - - if (0 == stat(info->urlOf(UrlInfoType::kUrl).path().toStdString().data(), &statInfo)) - d->sizeInfo->dirSize = statInfo.st_size == 0 ? FileUtils::getMemoryPageSize() : static_cast(statInfo.st_size); - } directory_queue << url; } } diff --git a/src/plugins/common/core/dfmplugin-fileoperations/fileoperations/fileoperationutils/abstractworker.cpp b/src/plugins/common/core/dfmplugin-fileoperations/fileoperations/fileoperationutils/abstractworker.cpp index db87eef582..3775ffa39a 100644 --- a/src/plugins/common/core/dfmplugin-fileoperations/fileoperations/fileoperationutils/abstractworker.cpp +++ b/src/plugins/common/core/dfmplugin-fileoperations/fileoperations/fileoperationutils/abstractworker.cpp @@ -42,6 +42,7 @@ void AbstractWorker::setWorkArgs(const JobHandlePointer handle, const QListdirSize = FileUtils::getMemoryPageSize(); this->handle = handle; initHandleConnects(handle); this->sourceUrls = sources; @@ -194,17 +195,21 @@ bool AbstractWorker::statisticsFilesSize() if (isSourceFileLocal) { const SizeInfoPointer &fileSizeInfo = FileOperationsUtils::statisticsFilesSize(sourceUrls, true); - allFilesList = fileSizeInfo->allFiles; sourceFilesTotalSize = fileSizeInfo->totalSize; workData->dirSize = fileSizeInfo->dirSize; sourceFilesCount = fileSizeInfo->fileCount; } else { statisticsFilesSizeJob.reset(new DFMBASE_NAMESPACE::FileStatisticsJob()); - connect(statisticsFilesSizeJob.data(), &DFMBASE_NAMESPACE::FileStatisticsJob::finished, - this, &AbstractWorker::onStatisticsFilesSizeFinish, Qt::DirectConnection); - connect(statisticsFilesSizeJob.data(), &DFMBASE_NAMESPACE::FileStatisticsJob::sizeChanged, this, &AbstractWorker::onStatisticsFilesSizeUpdate, Qt::DirectConnection); statisticsFilesSizeJob->start(sourceUrls); + while(!statisticsFilesSizeJob->isFinished()) { + QThread::msleep(10); + } + const SizeInfoPointer &fileSizeInfo = statisticsFilesSizeJob->getFileSizeInfo(); + allFilesList = fileSizeInfo->allFiles; + sourceFilesTotalSize = fileSizeInfo->totalSize; + workData->dirSize = fileSizeInfo->dirSize; + sourceFilesCount = fileSizeInfo->fileCount; } return true; } diff --git a/src/plugins/common/core/dfmplugin-fileoperations/fileoperations/fileoperationutils/fileoperatebaseworker.cpp b/src/plugins/common/core/dfmplugin-fileoperations/fileoperations/fileoperationutils/fileoperatebaseworker.cpp index c1f1e3e718..43505d916f 100644 --- a/src/plugins/common/core/dfmplugin-fileoperations/fileoperations/fileoperationutils/fileoperatebaseworker.cpp +++ b/src/plugins/common/core/dfmplugin-fileoperations/fileoperations/fileoperationutils/fileoperatebaseworker.cpp @@ -1152,7 +1152,7 @@ bool FileOperateBaseWorker::doCopyFile(const FileInfoPointer &fromInfo, const Fi } else if (fromInfo->isAttributes(OptInfoType::kIsDir)) { result = checkAndCopyDir(fromInfo, newTargetInfo, skip); if (result || skip) - workData->zeroOrlinkOrDirWriteSize += workData->dirSize; + workData->zeroOrlinkOrDirWriteSize += workData->dirSize <= 0 ? FileUtils::getMemoryPageSize() : workData->dirSize; } else { result = checkAndCopyFile(fromInfo, newTargetInfo, skip); } @@ -1324,7 +1324,8 @@ void FileOperateBaseWorker::determineCountProcessType() if (targetIsRemovable) { workData->exBlockSyncEveryWrite = FileOperationsUtils::blockSync(); - countWriteType = workData->exBlockSyncEveryWrite ? CountWriteSizeType::kCustomizeType : CountWriteSizeType::kWriteBlockType; + countWriteType = workData->exBlockSyncEveryWrite ? CountWriteSizeType::kCustomizeType + : CountWriteSizeType::kCustomizeType; targetDeviceStartSectorsWritten = workData->exBlockSyncEveryWrite ? 0 : getSectorsWritten(); workData->isBlockDevice = true;