Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 目录大小_C++_C_Windows_Winapi - Fatal编程技术网

C++ 目录大小

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

有没有一种方法可以获得目录大小/文件夹大小,而无需实际遍历此目录并添加其中每个文件的大小?理想情况下,您希望使用boost之类的库,但win api也可以。

据我所知,您必须在大多数操作系统上使用迭代

您可以看看boost.filesystem,这个库有一个递归的_目录_迭代器,它将迭代系统上任何文件的大小

包括
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");