当我使用递归查看每个文件时,如何获取文件的大小?我收到了下一个错误:
project.exe已退出,代码为-1073741819
int dir_size(const QString _wantedDirPath)
{
long int sizex = 0;
QFileInfo str_info(_wantedDirPath);
if (str_info.isDir())
{
QDir dir(_wantedDirPath);
QStringList ext_list;
dir.setFilter(QDir::Files | QDir::Dirs | QDir::Hidden | QDir::NoSymLinks);
QFileInfoList list = dir.entryInfoList();
for(int i = 0; i < list.size(); ++i)
{
QFileInfo fileInfo = list.at(i);
if ((fileInfo.fileName() != ".") && (fileInfo.fileName() != ".."))
{
sizex += (fileInfo.isDir()) ? this->dir_size(fileInfo.path()) : fileInfo.size():
QApplication::processEvents();
}
}
}
return sizex;
}
Run Code Online (Sandbox Code Playgroud)
首先清理一下代码.
quint64 dir_size(const QString & str)
{
quint64 sizex = 0;
QFileInfo str_info(str);
if (str_info.isDir())
{
QDir dir(str);
QFileInfoList list = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::Hidden | QDir::NoSymLinks | QDir::NoDotAndDotDot);
for (int i = 0; i < list.size(); ++i)
{
QFileInfo fileInfo = list.at(i);
if(fileInfo.isDir())
{
sizex += dir_size(fileInfo.absoluteFilePath());
}
else
sizex += fileInfo.size();
}
}
return sizex;
}
Run Code Online (Sandbox Code Playgroud)
如果你想保持ui被动,在一个单独的线程中进行计算,在每个文件中调用processEvent()是一个负担.你还应该使用quint64(unsigned long long)来处理大文件(> 2Go)但是,目前还不清楚崩溃的位置.
它崩溃是因为您一次又一次递归地评估同一个文件夹。该语句sizex += this->dir_size(fileInfo.path());
使用相同的文件夹名称递归调用相同的函数。所以你的堆栈不断增长并最终耗尽内存。
fileInfo.path()
给出相同的(父)文件夹。
fileInfo.filePath()
给出带有路径的文件名
将其更改为 sizex += this->dir_size(fileInfo.filePath());
,应该可以修复它
归档时间: |
|
查看次数: |
4848 次 |
最近记录: |