How can I find the size of all files located inside a folder?

后端 未结 12 2371
萌比男神i
萌比男神i 2020-12-06 05:49

Is there any API in c++ for getting the size of a specified folder?

If not, how can I get the total size of a folder including all subfolders and files?

12条回答
  •  一生所求
    2020-12-06 06:13

    I have my types definition file with:

    typedef std::wstring String;
    typedef std::vector StringVector;
    typedef unsigned long long uint64_t;
    

    and code is:

    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(".."));
    }
    

    This uses UNICODE and returns failed dirs if you want that.

    To call use:

    StringVector vect;
    CalculateDirSize(L"C:\\boost_1_52_0", &vect);
    CalculateDirSize(L"C:\\boost_1_52_0");
    

    But never pass size

提交回复
热议问题