Index: dll/win32/shell32/dialogs/filedefext.cpp =================================================================== --- dll/win32/shell32/dialogs/filedefext.cpp (revision 75273) +++ dll/win32/shell32/dialogs/filedefext.cpp (working copy) @@ -484,6 +484,8 @@ BOOL Success; WIN32_FIND_DATAW FileInfo; // WIN32_FILE_ATTRIBUTE_DATA WCHAR wszBuf[MAX_PATH]; + ULONG lpBytesPerSector; + ULONG lpSectorsPerCluster; + TCHAR lpszVolumePathName[MAX_PATH]; TRACE("InitFileAttr %ls\n", m_wszPath); @@ -551,8 +553,19 @@ ULARGE_INTEGER FileSize; FileSize.u.LowPart = FileInfo.nFileSizeLow; FileSize.u.HighPart = FileInfo.nFileSizeHigh; - if (SH_FormatFileSizeWithBytes(&FileSize, wszBuf, _countof(wszBuf))) + if (SH_FormatFileSizeWithBytes(&FileSize, wszBuf, _countof(wszBuf))) { SetDlgItemTextW(hwndDlg, 14011, wszBuf); + // Calculate size on disc + if( GetVolumePathName(m_wszPath, lpszVolumePathName, sizeof(lpszVolumePathName) / sizeof(TCHAR)) ) { + if( GetDiskFreeSpace(lpszVolumePathName, &lpSectorsPerCluster, &lpBytesPerSector, NULL, NULL) ) { + if(FileSize.QuadPart % (lpBytesPerSector*lpSectorsPerCluster)) { + FileSize.QuadPart = ((FileSize.QuadPart / (lpBytesPerSector*lpSectorsPerCluster))+1)*lpBytesPerSector*lpSectorsPerCluster; + SH_FormatFileSizeWithBytes(&FileSize, wszBuf, _countof(wszBuf)); + } + } + } + SetDlgItemTextW(hwndDlg, 14012, wszBuf); + } } } @@ -571,8 +584,19 @@ SHCreateThread(CFileDefExt::_CountFolderAndFilesThreadProc, data, NULL, NULL); /* Update size field */ - if (SH_FormatFileSizeWithBytes(&m_DirSize, wszBuf, _countof(wszBuf))) + if (SH_FormatFileSizeWithBytes(&m_DirSize, wszBuf, _countof(wszBuf))) { SetDlgItemTextW(hwndDlg, 14011, wszBuf); + // Calculate size on disc + if( GetVolumePathName(m_wszPath, lpszVolumePathName, sizeof(lpszVolumePathName) / sizeof(TCHAR)) ) { + if( GetDiskFreeSpace(lpszVolumePathName, &lpSectorsPerCluster, &lpBytesPerSector, NULL, NULL) ) { + if(m_DirSize.QuadPart % (lpBytesPerSector*lpSectorsPerCluster)) { + m_DirSize.QuadPart = ((m_DirSize.QuadPart / (lpBytesPerSector*lpSectorsPerCluster))+1)*lpBytesPerSector*lpSectorsPerCluster; + SH_FormatFileSizeWithBytes(&m_DirSize, wszBuf, _countof(wszBuf)); + } + } + } + SetDlgItemTextW(hwndDlg, 14012, wszBuf); + } /* Display files and folders count */ WCHAR wszFormat[256]; @@ -890,6 +914,7 @@ { m_wszPath[0] = L'\0'; m_DirSize.QuadPart = 0ull; + m_DirSizeOnDisc.QuadPart = 0ull; } CFileDefExt::~CFileDefExt() @@ -1025,6 +1050,8 @@ /* Find filename position */ UINT cchBuf = wcslen(pwszBuf); WCHAR *pwszFilename = pwszBuf + cchBuf; + ULONG lpBytesPerSector; + ULONG lpSectorsPerCluster; + TCHAR lpszVolumePathName[MAX_PATH]; size_t cchFilenameMax = cchBufMax - cchBuf; if (!cchFilenameMax) return FALSE; @@ -1069,6 +1096,15 @@ FileSize.u.LowPart = wfd.nFileSizeLow; FileSize.u.HighPart = wfd.nFileSizeHigh; m_DirSize.QuadPart += FileSize.QuadPart; + // Calculate size on disc + if( GetVolumePathName(pwszBuf, lpszVolumePathName, sizeof(lpszVolumePathName) / sizeof(TCHAR)) ) { + if( GetDiskFreeSpace(lpszVolumePathName, &lpSectorsPerCluster, &lpBytesPerSector, NULL, NULL) ) + m_DirSizeOnDisc.QuadPart += FileSize.QuadPart % (lpBytesPerSector*lpSectorsPerCluster) ? ((FileSize.QuadPart/(lpBytesPerSector*lpSectorsPerCluster))+1)*lpBytesPerSector*lpSectorsPerCluster : FileSize.QuadPart; + else + m_DirSizeOnDisc.QuadPart += FileSize.QuadPart; + } else { + m_DirSizeOnDisc.QuadPart += FileSize.QuadPart; + } } if (GetTickCount() - *ticks > (DWORD) 300) { @@ -1079,6 +1115,8 @@ if (SH_FormatFileSizeWithBytes(&m_DirSize, wszBuf, _countof(wszBuf))) SetDlgItemTextW(hwndDlg, 14011, wszBuf); + if (SH_FormatFileSizeWithBytes(&m_DirSizeOnDisc, wszBuf, _countof(wszBuf))) + SetDlgItemTextW(hwndDlg, 14012, wszBuf); /* Display files and folders count */ WCHAR wszFormat[256]; @@ -1098,7 +1136,8 @@ if (SH_FormatFileSizeWithBytes(&m_DirSize, wszBuf, _countof(wszBuf))) SetDlgItemTextW(hwndDlg, 14011, wszBuf); - + if (SH_FormatFileSizeWithBytes(&m_DirSizeOnDisc, wszBuf, _countof(wszBuf))) + SetDlgItemTextW(hwndDlg, 14012, wszBuf); /* Display files and folders count */ WCHAR wszFormat[256]; LoadStringW(shell32_hInstance, IDS_FILE_FOLDER, wszFormat, _countof(wszFormat)); Index: dll/win32/shell32/dialogs/filedefext.h =================================================================== --- dll/win32/shell32/dialogs/filedefext.h (revision 75273) +++ dll/win32/shell32/dialogs/filedefext.h (working copy) @@ -82,6 +82,7 @@ DWORD m_cFiles; DWORD m_cFolders; ULARGE_INTEGER m_DirSize; + ULARGE_INTEGER m_DirSizeOnDisc; static DWORD WINAPI _CountFolderAndFilesThreadProc(LPVOID lpParameter); @@ -125,4 +126,4 @@ UINT cchBufMax; }; -#endif /* _FILE_DEF_EXT_H_ */ \ No newline at end of file +#endif /* _FILE_DEF_EXT_H_ */