C++ 目录大小
有没有一种方法可以获得目录大小/文件夹大小,而无需实际遍历此目录并添加其中每个文件的大小?理想情况下,您希望使用boost之类的库,但win api也可以。据我所知,您必须在大多数操作系统上使用迭代 您可以看看boost.filesystem,这个库有一个递归的_目录_迭代器,它将迭代系统上任何文件的大小C++ 目录大小,c++,c,windows,winapi,C++,C,Windows,Winapi,有没有一种方法可以获得目录大小/文件夹大小,而无需实际遍历此目录并添加其中每个文件的大小?理想情况下,您希望使用boost之类的库,但win api也可以。据我所知,您必须在大多数操作系统上使用迭代 您可以看看boost.filesystem,这个库有一个递归的_目录_迭代器,它将迭代系统上任何文件的大小 包括 int main() { 名称空间bf=boost::filesystem; 大小\u t大小=0; 对于(bf::recursive_directory_iterator it(“p
包括
int main()
{
名称空间bf=boost::filesystem;
大小\u t大小=0;
对于(bf::recursive_directory_iterator it(“path”);
it!=bf::递归目录迭代器();
++(it)
{
如果(!bf::is_目录(*it))
大小+=bf::文件大小(*it);
}
}
PS:通过使用std::accumulate和lambda,你可以使这变得更干净,我只是CBA我不认为有这样的东西,至少没有win32 api函数 本机windows:
void DirectoryInfo::CalculateSize(std::string _path)
{
WIN32_FIND_DATAA data;
HANDLE sh = NULL;
sh = FindFirstFileA((_path+"\\*").c_str(), &data);
if (sh == INVALID_HANDLE_VALUE )
{
return;
}
do
{
// skip current and parent
if (std::string(data.cFileName).compare(".") != 0 && std::string(data.cFileName).compare("..") != 0)
{
// if found object is ...
if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
// directory, then search it recursievly
this->CalculateSize(_path+"\\"+data.cFileName);
} else
{
// otherwise get object size and add it to directory size
this->dirSize += (__int64) (data.nFileSizeHigh * (MAXDWORD ) + data.nFileSizeLow);
}
}
} while (FindNextFileA(sh, &data)); // do
FindClose(sh);
}
您必须遍历这些文件。如果树中有硬链接或重分析点,则要获得正确的结果很困难。有关详细信息,请参阅雷蒙德·陈的。齐洛的回答相当不错,但我会用类似但不同的方式来回答 我的类型定义文件包含:
typedef std::wstring String;
typedef std::vector<String> StringVector;
typedef unsigned long long uint64_t;
这将使用UNICODE并返回失败的目录(如果需要)
要调用或使用:
StringVector vect;
CalculateDirSize(L"C:\\boost_1_52_0", &vect);
CalculateDirSize(L"C:\\boost_1_52_0");
但千万不要通过
尺寸
可能不会。这就是为什么右键单击->属性要花这么长时间才能运行的原因……我也不明白为什么要对它进行否决。这是一个非常有道理的问题。来吧,伙计们。太本地化了?真的。研究工作,这是你在下一票按钮上挥动鼠标的第一个原因。一个简单的谷歌搜索将提供大量的“你必须遍历”信息。我的意思是,Windows资源管理器显然执行了遍历这一事实应该是足够的暗示。有趣的是,这个问题是“重复”的,是在这一年之后提出的。另一个问题不应该是这个问题的重复吗?几乎可以,但是IsBrowsePath
函数缺失。我很确定我们需要乘以(MAXDWORD+1)。假设无符号:(uint64_t)(data.nFileSizeHigh*((uint64_t)MAXDWORD+1))
使用您对accumulate和lambda的建议,这将变成:auto dirSize=std::accumulate(递归目录迭代器(“路径”)、递归目录迭代器()、0,[](auto sz,auto entry){return is_directory(entry)→sz:sz+file_size(entry);});在111111和cocheci的解决方案之间,我从同一个文件夹中得到了不同的结果:/I我猜测哪一个是错误的。
uint64_t CalculateDirSize(const String &path, StringVector *errVect = NULL, uint64_t size = 0)
{
WIN32_FIND_DATA data;
HANDLE sh = NULL;
sh = FindFirstFile((path + L"\\*").c_str(), &data);
if (sh == INVALID_HANDLE_VALUE )
{
//if we want, store all happened error
if (errVect != NULL)
errVect ->push_back(path);
return size;
}
do
{
// skip current and parent
if (!IsBrowsePath(data.cFileName))
{
// if found object is ...
if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
// directory, then search it recursievly
size = CalculateDirSize(path + L"\\" + data.cFileName, NULL, size);
else
// otherwise get object size and add it to directory size
size += (uint64_t) (data.nFileSizeHigh * (MAXDWORD ) + data.nFileSizeLow);
}
} while (FindNextFile(sh, &data)); // do
FindClose(sh);
return size;
}
bool IsBrowsePath(const String& path)
{
return (path == _T(".") || path == _T(".."));
}
StringVector vect;
CalculateDirSize(L"C:\\boost_1_52_0", &vect);
CalculateDirSize(L"C:\\boost_1_52_0");