dll/win32/shell32/dialogs/filedefext.cpp | 43 +++++++++++++++++++++++++++++--- dll/win32/shell32/dialogs/filedefext.h | 3 ++- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/dll/win32/shell32/dialogs/filedefext.cpp b/dll/win32/shell32/dialogs/filedefext.cpp index 042faa3..f6c65e2 100644 --- a/dll/win32/shell32/dialogs/filedefext.cpp +++ b/dll/win32/shell32/dialogs/filedefext.cpp @@ -484,7 +484,10 @@ CFileDefExt::InitFileAttr(HWND hwndDlg) 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); /* @@ -552,7 +555,19 @@ CFileDefExt::InitFileAttr(HWND hwndDlg) FileSize.u.LowPart = FileInfo.nFileSizeLow; FileSize.u.HighPart = FileInfo.nFileSizeHigh; 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); + } } } @@ -573,7 +588,9 @@ CFileDefExt::InitFileAttr(HWND hwndDlg) /* Update size field */ 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)); @@ -890,6 +907,7 @@ CFileDefExt::CFileDefExt(): { m_wszPath[0] = L'\0'; m_DirSize.QuadPart = 0ull; + m_DirSizeOnDisc.QuadPart = 0ull; } CFileDefExt::~CFileDefExt() @@ -1025,6 +1043,9 @@ CFileDefExt::CountFolderAndFiles(HWND hwndDlg, LPWSTR pwszBuf, UINT cchBufMax, D /* 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 +1090,16 @@ CFileDefExt::CountFolderAndFiles(HWND hwndDlg, LPWSTR pwszBuf, UINT cchBufMax, D 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,7 +1110,9 @@ CFileDefExt::CountFolderAndFiles(HWND hwndDlg, LPWSTR pwszBuf, UINT cchBufMax, D 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)); @@ -1098,7 +1131,9 @@ CFileDefExt::CountFolderAndFiles(HWND hwndDlg, LPWSTR pwszBuf, UINT cchBufMax, D 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)); diff --git a/dll/win32/shell32/dialogs/filedefext.h b/dll/win32/shell32/dialogs/filedefext.h index 4a1c710..d3ea930 100644 --- a/dll/win32/shell32/dialogs/filedefext.h +++ b/dll/win32/shell32/dialogs/filedefext.h @@ -82,7 +82,8 @@ private: DWORD m_cFiles; DWORD m_cFolders; ULARGE_INTEGER m_DirSize; - + ULARGE_INTEGER m_DirSizeOnDisc; + static DWORD WINAPI _CountFolderAndFilesThreadProc(LPVOID lpParameter); public: