Не совсем оптимально, и если ещё актуально
Code
#define UNICODE
#include <windows.h>
#include <wchar.h>
#include <stdio.h>
ULONG GetDirSize(WCHAR* path)
{
ULONG DirSize = 0;
WIN32_FIND_DATAW FindFileData;
HANDLE hFind;
WCHAR buff[MAX_PATH];
ZeroMemory(&buff[0],MAX_PATH);
lstrcat(&buff[0],path);
lstrcat(&buff[0],L"\\*.*");
hFind = FindFirstFileExW(&buff[0], FindExInfoStandard, &FindFileData, FindExSearchNameMatch, NULL, 0);
if (hFind == INVALID_HANDLE_VALUE)
{
return 0;
}
DirSize += FindFileData.nFileSizeLow;
while (FindNextFileW(hFind, &FindFileData) != 0)
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (lstrcmp(FindFileData.cFileName,L"..") != 0)
{
ZeroMemory(&buff[0],MAX_PATH);
lstrcat(&buff[0],path);
lstrcat(&buff[0],L"\\");
lstrcat(&buff[0],FindFileData.cFileName);
DirSize += GetDirSize(&buff[0]);
}
}
else
{
DirSize += FindFileData.nFileSizeLow;
}
}
FindClose(hFind);
return DirSize;
}
int main(int argc, CHAR* argv[])
{
WCHAR path[MAX_PATH];
WCHAR* ppath;
ppath = &path[1];
ULONG DirSize = 0;
if( argc < 2 )
{
printf("Usage: %s [target_file]\n", argv[0]);
return 0;
}
mbstowcs(ppath,argv[1],MAX_PATH);
wprintf(L"Directory name: %s\nSize: %d",ppath,GetDirSize(ppath));
return 0;
}