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

后端 未结 12 2368
萌比男神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<String> 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

    0 讨论(0)
  • 2020-12-06 06:14

    The file system functions are integral part of each operative system, written mostly in C and assembler, not C++, each C++ library implementation for this are in one way or another a wrapper of this functions. Taking on count the effort and if you will not use your implementation in different OS, maybe is a good idea to use this functions directly and save some overhead and time.

    Best regards.

    0 讨论(0)
  • 2020-12-06 06:14

    Something like this would be better to avoid adding symbolic(soft) links:

    size_t directorySize(const std::filesystem::path& directory)
    {
        size_t size{ 0 };
        for (const auto& entry : std::filesystem::recursive_directory_iterator(directory))
        {
            if (entry.is_regular_file() && !entry.is_symlink())
            {
                size += entry.file_size();
            }
        }
        return size;
    }
    
    0 讨论(0)
  • 2020-12-06 06:15

    Size of files in a folder Please have a look at this link

    #include <iostream>
    #include <windows.h>
    #include <string>
    using namespace std;
    
    
    __int64 TransverseDirectory(string path)
    {
        WIN32_FIND_DATA data;
        __int64 size = 0;
        string fname = path + "\\*.*";
        HANDLE h = FindFirstFile(fname.c_str(),&data);
        if(h != INVALID_HANDLE_VALUE)
        {
            do {
                if( (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
                {
                    // make sure we skip "." and "..".  Have to use strcmp here because
                    // some file names can start with a dot, so just testing for the 
                    // first dot is not suffient.
                    if( strcmp(data.cFileName,".") != 0 &&strcmp(data.cFileName,"..") != 0)
                    {
                        // We found a sub-directory, so get the files in it too
                        fname = path + "\\" + data.cFileName;
                        // recurrsion here!
                        size += TransverseDirectory(fname);
                    }
    
                }
                else
                {
                    LARGE_INTEGER sz;
                    // All we want here is the file size.  Since file sizes can be larger
                    // than 2 gig, the size is reported as two DWORD objects.  Below we
                    // combine them to make one 64-bit integer.
                    sz.LowPart = data.nFileSizeLow;
                    sz.HighPart = data.nFileSizeHigh;
                    size += sz.QuadPart;
    
                }
            }while( FindNextFile(h,&data) != 0);
            FindClose(h);
    
        }
        return size;
    }
    
    int main(int argc, char* argv[])
    {
        __int64 size = 0;
        string path;
        size = TransverseDirectory("c:\\dvlp");
        cout << "\n\nDirectory Size = " << size << "\n";
        cin.ignore();
        return 0;
    }
    

    For more detail PLease CLick Here

    0 讨论(0)
  • 2020-12-06 06:18

    With the introduction of std::filesystem, you no more have to use any system APIs or any external libraries.

    #include <filesystem>
    namespace n_fs = ::std::filesystem;
    double archive::getFolderSize(std::string path)
    {
            double r = 0.0;
            try{
               if (!n_fs::is_directory(path))
               {
                    r += (double)n_fs::file_size(path);
               }
               else
               {
                    for(auto entry: n_fs::directory_iterator(path))
                    getFolderSize(entry.path().string());
                }
            } 
            catch(exception& e)
            { 
                std::cout << e.what() << std::endl();
            }
            return r;
    }
    
    int main(){
        double folderSize = getFolderSize("~/dev/"); //Replace with your path
        std::cout << "Size of Folder: " << folderSize;
    }
    
    0 讨论(0)
  • 2020-12-06 06:22

    5 years and not a simple solution with standard C++, that's why I would like to contribute my solution to this question:

    uint64_t GetDirSize(const std::string &path)
    {
        uint64_t size = 0;
        for (const auto & entry : std::experimental::filesystem::directory_iterator(path))
        {
            if(entry.status().type() == std::experimental::filesystem::file_type::regular)
                size += std::experimental::filesystem::file_size(entry.path());
            if (entry.status().type() == std::experimental::filesystem::file_type::directory)
                size += GetDirSize(entry.path().generic_string());
        }
        return size;
    }
    

    Use it for example by calling GetDirSize("C:\\dir_name") if you're using Windows.

    0 讨论(0)
提交回复
热议问题