BOOL CFileDefExt::CountFolderAndFiles(LPWSTR pwszBuf, UINT cchBufMax) { /* Find filename position */ UINT cchBuf = wcslen(pwszBuf); WCHAR *pwszFilename = pwszBuf + cchBuf; size_t cchFilenameMax = cchBufMax - cchBuf; if (!cchFilenameMax) return FALSE; *(pwszFilename++) = '\\'; --cchFilenameMax; /* Find all files, FIXME: shouldn't be "*"? */ StringCchCopyW(pwszFilename, cchFilenameMax, L"*"); WIN32_FIND_DATAW wfd; HANDLE hFind = FindFirstFileW(pwszBuf, &wfd); if (hFind == INVALID_HANDLE_VALUE) { ERR("FindFirstFileW %ls failed\n", pwszBuf); return FALSE; } do { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { /* Don't process "." and ".." items */ if (!wcscmp(wfd.cFileName, L".") || !wcscmp(wfd.cFileName, L"..")) continue; ++m_cFolders; StringCchCopyW(pwszFilename, cchFilenameMax, wfd.cFileName); CountFolderAndFiles(pwszBuf, cchBufMax); } else { m_cFiles++; ULARGE_INTEGER FileSize; FileSize.u.LowPart = wfd.nFileSizeLow; FileSize.u.HighPart = wfd.nFileSizeHigh; m_DirSize.QuadPart += FileSize.QuadPart; } } while(FindNextFileW(hFind, &wfd)); FindClose(hFind); return TRUE; }
BOOL CFileDefExt::InitFileAttr(HWND hwndDlg) { WCHAR wszBuf[MAX_PATH]; TRACE("InitFileAttr %ls\n", m_wszPath); WIN32_FILE_ATTRIBUTE_DATA FileInfo; if (GetFileAttributesExW(m_wszPath, GetFileExInfoStandard, &FileInfo)) { /* Update attribute checkboxes */ if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY) SendDlgItemMessage(hwndDlg, 14021, BM_SETCHECK, BST_CHECKED, 0); if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) SendDlgItemMessage(hwndDlg, 14022, BM_SETCHECK, BST_CHECKED, 0); if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) SendDlgItemMessage(hwndDlg, 14023, BM_SETCHECK, BST_CHECKED, 0); /* Update creation time */ if (GetFileTimeString(&FileInfo.ftCreationTime, wszBuf, _countof(wszBuf))) SetDlgItemTextW(hwndDlg, 14015, wszBuf); /* For files display last access and last write time */ if (!m_bDir) { if (GetFileTimeString(&FileInfo.ftLastAccessTime, wszBuf, _countof(wszBuf))) SetDlgItemTextW(hwndDlg, 14019, wszBuf); if (GetFileTimeString(&FileInfo.ftLastWriteTime, wszBuf, _countof(wszBuf))) SetDlgItemTextW(hwndDlg, 14017, wszBuf); /* Update size of file */ ULARGE_INTEGER FileSize; FileSize.u.LowPart = FileInfo.nFileSizeLow; FileSize.u.HighPart = FileInfo.nFileSizeHigh; if (SH_FormatFileSizeWithBytes(&FileSize, wszBuf, _countof(wszBuf))) SetDlgItemTextW(hwndDlg, 14011, wszBuf); } } if (m_bDir) { /* For directories files have to be counted */ StringCchCopyW(wszBuf, _countof(wszBuf), m_wszPath); CountFolderAndFiles(wszBuf, _countof(wszBuf)); /* Update size filed */ if (SH_FormatFileSizeWithBytes(&m_DirSize, wszBuf, _countof(wszBuf))) SetDlgItemTextW(hwndDlg, 14011, wszBuf); /* Display files and folders count */ WCHAR wszFormat[256]; LoadStringW(shell32_hInstance, IDS_FILE_FOLDER, wszFormat, _countof(wszFormat)); StringCchPrintfW(wszBuf, _countof(wszBuf), wszFormat, m_cFiles, m_cFolders); SetDlgItemTextW(hwndDlg, 14027, wszBuf); } /* Hide Advanced button. TODO: Implement advanced dialog and enable this button if filesystem supports compression or encryption */ ShowWindow(GetDlgItem(hwndDlg, 14028), SW_HIDE); return TRUE; }
BOOL CFileDefExt::CountFolderAndFiles(HWND hwndDlg, LPWSTR pwszBuf, UINT cchBufMax, DWORD *ticks) { /* Find filename position */ UINT cchBuf = wcslen(pwszBuf); WCHAR *pwszFilename = pwszBuf + cchBuf; size_t cchFilenameMax = cchBufMax - cchBuf; if (!cchFilenameMax) return FALSE; *(pwszFilename++) = '\\'; --cchFilenameMax; /* Find all files, FIXME: shouldn't be "*"? */ StringCchCopyW(pwszFilename, cchFilenameMax, L"*"); WIN32_FIND_DATAW wfd; HANDLE hFind = FindFirstFileW(pwszBuf, &wfd); if (hFind == INVALID_HANDLE_VALUE) { ERR("FindFirstFileW %ls failed\n", pwszBuf); return FALSE; } BOOL root = FALSE; if (*ticks == 0) { *ticks = GetTickCount(); root = TRUE; } do { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { /* Don't process "." and ".." items */ if (!wcscmp(wfd.cFileName, L".") || !wcscmp(wfd.cFileName, L"..")) continue; ++m_cFolders; StringCchCopyW(pwszFilename, cchFilenameMax, wfd.cFileName); CountFolderAndFiles(hwndDlg, pwszBuf, cchBufMax, ticks); } else { m_cFiles++; ULARGE_INTEGER FileSize; FileSize.u.LowPart = wfd.nFileSizeLow; FileSize.u.HighPart = wfd.nFileSizeHigh; m_DirSize.QuadPart += FileSize.QuadPart; } if (GetTickCount() - *ticks > (DWORD) 300) { /* FIXME Using IsWindow is generally ill advised */ if (IsWindow(hwndDlg)) { WCHAR wszBuf[MAX_PATH]; if (SH_FormatFileSizeWithBytes(&m_DirSize, wszBuf, _countof(wszBuf))) SetDlgItemTextW(hwndDlg, 14011, wszBuf); /* Display files and folders count */ WCHAR wszFormat[256]; LoadStringW(shell32_hInstance, IDS_FILE_FOLDER, wszFormat, _countof(wszFormat)); StringCchPrintfW(wszBuf, _countof(wszBuf), wszFormat, m_cFiles, m_cFolders); SetDlgItemTextW(hwndDlg, 14027, wszBuf); *ticks = GetTickCount(); } else break; } } while(FindNextFileW(hFind, &wfd)); if (root && IsWindow(hwndDlg)) { WCHAR wszBuf[MAX_PATH]; if (SH_FormatFileSizeWithBytes(&m_DirSize, wszBuf, _countof(wszBuf))) SetDlgItemTextW(hwndDlg, 14011, wszBuf); /* Display files and folders count */ WCHAR wszFormat[256]; LoadStringW(shell32_hInstance, IDS_FILE_FOLDER, wszFormat, _countof(wszFormat)); StringCchPrintfW(wszBuf, _countof(wszBuf), wszFormat, m_cFiles, m_cFolders); SetDlgItemTextW(hwndDlg, 14027, wszBuf); } FindClose(hFind); return TRUE; }