i make many changes:
-1)add a GetFileSize() function;
-2)give a number gap of 1000, like 3,234,122;
-3)use 2 kinds of unit to make difference, K" for folders, KB for files;
-4)use "files + folders <200" as recusive limit, and add '~' just for large scale folders, it gets much faster;
-5)text fmt is now set to "right" side;
....so "size" column now looks like:
```````````````````~21,813 K"| folder
`````````````````````1,332 KB| file
I put the whole file of "colhandler.cpp", header file is easy to edit.
==========================================================
<small>
#include "stdafx.h"<br />
#include "DirSize.h"<br />
#include "ColHandler.h"<br />
<br />
<br />
STDMETHODIMP CColHandler::Initialize(LPCSHCOLUMNINIT psci)<br />
{<br />
return S_OK;<br />
}<br />
<br />
STDMETHODIMP CColHandler::GetColumnInfo(DWORD dwIndex, SHCOLUMNINFO *psci)<br />
{<br />
TCHAR szText[] = "size";<br />
<br />
psci->scid.fmtid.Data1 = 0x28636AA6L;<br />
psci->scid.fmtid.Data2 = 0x953D;<br />
psci->scid.fmtid.Data3 = 0x11D2;<br />
strcpy((char *)psci->scid.fmtid.Data4,"B5D600C04FD918D0");<br />
<br />
psci->scid.pid = 12;<br />
psci->vt = VT_BSTR;<br />
psci->fmt = LVCFMT_RIGHT; psci->cChars = 35;<br />
psci->csFlags = SHCOLSTATE_TYPE_STR|SHCOLSTATE_SLOW;<br />
<br />
<br />
MultiByteToWideChar( CP_ACP, 0, szText,<br />
strlen(szText)+1, psci->wszTitle, <br />
sizeof(psci->wszTitle)/sizeof(psci->wszTitle[0]) );<br />
<br />
MultiByteToWideChar( CP_ACP, 0, szText,<br />
strlen(szText)+1, psci->wszDescription, <br />
sizeof(psci->wszDescription)/sizeof(psci->wszDescription[0]) );<br />
<br />
if(dwIndex == 0)<br />
{<br />
return S_OK;<br />
}<br />
else<br />
{<br />
return S_FALSE;<br />
}<br />
}<br />
<br />
STDMETHODIMP CColHandler::GetItemData(LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, VARIANT *pvarData)<br />
{<br />
USES_CONVERSION;<br />
V_VT(pvarData) = VT_BSTR;<br />
DWORD dwSize = 0;<br />
char szTmp[200],sz_[200];<br />
DWORD dwFiles = 0, dwFolders = 0;<br />
BOOL bLimit=false;<br />
<br />
DWORD64 size = 0;<br />
if( pscd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )<br />
dwSize = GetFolderSize(OLE2T(pscd->wszFile),&dwFiles,&dwFolders,&bLimit);<br />
else<br />
{<br />
dwSize = GetFileSize(OLE2T(pscd->wszFile),&dwFiles,&dwFolders);<br />
}<br />
<br />
{<br />
size = dwSize/1024;<br />
if(dwSize%1024)<br />
size++;<br />
_i64toa(size,szTmp,10);<br />
<br />
int len=strlen(szTmp);<br />
int index=0;<br />
memset(sz_,0,200);<br />
if(bLimit)<br />
{<br />
strcat(sz_,"~"); index+=1;<br />
}<br />
<br />
int iTmp=len%3;<br />
if(iTmp!=0)<br />
{<br />
memcpy(sz_+index,szTmp,iTmp);<br />
index+=iTmp;<br />
len-=iTmp;<br />
<br />
if(len>0)<br />
{<br />
strcat(sz_,",");<br />
++index;<br />
}<br />
}<br />
<br />
while(len>0)<br />
{<br />
memcpy(sz_+index,szTmp+iTmp,3);<br />
index+=3;iTmp+=3;len-=3;<br />
if(len>0)<br />
{<br />
strcat(sz_,",");<br />
++index;<br />
}<br />
}<br />
if( pscd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )<br />
strcat(sz_," K\"");<br />
else strcat(sz_," KB");<br />
}<br />
<br />
V_BSTR(pvarData) = SysAllocString(T2OLE(sz_));<br />
<br />
return S_OK;<br />
}<br />
<br />
<br />
DWORD CColHandler::GetFolderSize(LPCTSTR szPath, DWORD *dwFiles, DWORD *dwFolders,BOOL *bLimit)<br />
{<br />
TCHAR szFileFilter[512];<br />
TCHAR szFilePath[512];<br />
HANDLE hFind = NULL;<br />
WIN32_FIND_DATA fileinfo;<br />
DWORD dwSize = 0;<br />
<br />
strcpy(szFilePath,szPath);<br />
strcat(szFilePath,"\\");<br />
strcpy(szFileFilter,szFilePath);<br />
strcat(szFileFilter,"*.*");<br />
<br />
<br />
hFind = FindFirstFile(szFileFilter,&fileinfo);<br />
do<br />
{<br />
if(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )<br />
{<br />
if (!strcmp(fileinfo.cFileName,".") || !strcmp(fileinfo.cFileName,".."))<br />
{<br />
}<br />
else<br />
{<br />
TCHAR sztmp[512];<br />
strcpy(sztmp,szFilePath);<br />
strcat(sztmp,fileinfo.cFileName);<br />
dwSize = dwSize + GetFolderSize(sztmp,dwFiles,dwFolders,bLimit);<br />
if(dwFolders != NULL)<br />
++(*dwFolders);<br />
}<br />
}<br />
else<br />
{<br />
if(dwFiles != NULL)<br />
++(*dwFiles);<br />
}<br />
<br />
dwSize += fileinfo.nFileSizeLow;<br />
if(dwFolders && dwFiles && bLimit)<br />
{<br />
if(*dwFolders+*dwFiles>200)<br />
*bLimit=true;<br />
}<br />
}while(FindNextFile(hFind,&fileinfo)&& ((bLimit!=NULL && !(*bLimit))||!bLimit) );<br />
<br />
FindClose(hFind);<br />
return dwSize;<br />
<br />
}<br />
<br />
DWORD CColHandler::GetFileSize(LPCTSTR szPath, DWORD *dwFiles, DWORD *dwFolders)<br />
{<br />
WIN32_FIND_DATA fileinfo;<br />
HANDLE hFind = FindFirstFile(szPath,&fileinfo);<br />
FindClose(hFind);<br />
return fileinfo.nFileSizeHigh * (MAXDWORD+1) + fileinfo.nFileSizeLow;<br />
}</small>
=====================================================
|