21

このディレクトリを実際にトラバースして各ファイルのサイズを追加せずに、ディレクトリのサイズ/フォルダーのサイズを取得する方法はありますか? 理想的には、boost のようなライブラリを使用したいのですが、win API も問題ありません。

4

4 に答える 4

18

私が知る限り、ほとんどのオペレーティング システムでは反復処理を行う必要があります。

boost.filesystem を見ることができます。このライブラリには recursive_directory_iterator があり、システム上のファイルが累積してサイズを取得するたびに反復します。

http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/reference.html#Class-recursive_directory_iterator

include <boost/filesystem.hpp>
int main()
{
    namespace bf=boost::filesystem;
    size_t size=0;
    for(bf::recursive_directory_iterator it("path");
        it!=bf::recursive_directory_iterator();
        ++it)
    {   
        if(!bf::is_directory(*it))
            size+=bf::file_size(*it);
    }   
}

PS: std::accumulate と lambda I just CBA を使用することで、これをもっときれいにすることができます

于 2012-04-04T16:32:35.530 に答える
4

そのようなものはないと思います。少なくともwin32 API機能はありません。

ウィンドウのネイティブ:

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);

} 
于 2012-04-04T16:42:08.367 に答える
2

ファイルをトラバースする必要があります。ツリーにハードリンクまたは再解析ポイントがある場合、正しい結果を取得するのは難しいです。詳細については、RaymondChenのブログ投稿を参照してください。

于 2012-04-04T17:02:37.533 に答える