Re: Поиск всех файлов в каталоге
От: stuff Украина www.tarnet.pisem.net
Дата: 22.05.03 13:20
Оценка:

//---------------------------------------------------------------------------------

void CClearSiteDlg::OnOpenDialog() 
{
    CountFindFiles = 0;
    
    CString strSelectedFolder; 
    m_path.GetWindowText(strSelectedFolder);

    LPTSTR szPath = strSelectedFolder.GetBuffer(_MAX_PATH);
    m_path.GetWindowText((CString)szPath);
    strSelectedFolder.ReleaseBuffer();
    
    if (GetFolder(&strSelectedFolder, "Выберете каталог сайта", szPath, NULL, this->m_hWnd)) {

        DirSite = strSelectedFolder;

        CWaitCursor waitCur;
        //подсчитываем количество фалов
        GetCountFile(szPath, "*.*");
        
        
        //обновляем caption формы
        UpdateCaptionForm(FinishFindFiles);
        
        //отображаем выбранный путь в CStatic
        m_path.SetWindowText(strSelectedFolder);
        waitCur.Restore();
    }
    
}
//---------------------------------------------------------------------------------

static int CALLBACK
BrowseCallbackProc (HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    TCHAR szPath[_MAX_PATH];
    switch (uMsg) {
    case BFFM_INITIALIZED:
        if (lpData)
            SendMessage(hWnd,BFFM_SETSELECTION,TRUE,lpData);
        break;
    case BFFM_SELCHANGED:
        SHGetPathFromIDList(LPITEMIDLIST(lParam),szPath);
        SendMessage(hWnd, BFFM_SETSTATUSTEXT, NULL, LPARAM(szPath));
        break;
    }
    return 0;
}
//---------------------------------------------------------------------------------

bool CClearSiteDlg::GetFolder (CString* strSelectedFolder, LPCTSTR szTitle, LPTSTR szPath, LPCTSTR szRoot, HWND hWndOwner)
{
    if (szPath == NULL) return false;

    bool result = false;

        BROWSEINFO bi;
        ::ZeroMemory(&bi,sizeof bi);
        bi.ulFlags   = BIF_RETURNONLYFSDIRS;

        // дескриптор окна-владельца диалога
        bi.hwndOwner = hWndOwner;

        // добавление заголовка к диалогу
        bi.lpszTitle = szTitle;

        // отображение текущего каталога
        bi.lpfn      = BrowseCallbackProc;
        bi.ulFlags  |= BIF_RETURNONLYFSDIRS ;

        // установка каталога по умолчанию
        bi.lParam    = LPARAM(szPath);

        // установка корневого каталога
        if (szRoot != NULL) {
            IShellFolder *pDF;
            if (SHGetDesktopFolder(&pDF) == NOERROR) {
                LPITEMIDLIST pIdl = NULL;
                ULONG        chEaten;
                ULONG        dwAttributes;

                USES_CONVERSION;
                LPOLESTR oleStr = T2OLE(szRoot);

                pDF->ParseDisplayName(NULL,NULL,oleStr,&chEaten,&pIdl,&dwAttributes);
                pDF->Release();

                bi.pidlRoot = pIdl;
            }
        }

        LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi);
        if (pidl != NULL) {
             TCHAR lpstrBuffer[_MAX_PATH] = _T("");
             SHGetPathFromIDList(pidl, lpstrBuffer);
             strSelectedFolder->Format("%s",lpstrBuffer);
             result = true;
        }

        // free memory returned by SHBrowseForFolder
        LPMALLOC lpm;
        if (SHGetMalloc(&lpm) == NOERROR) lpm->Free(pidl);    

  return result;
    
}
//-------------------------------------------------------------------------------------

void CClearSiteDlg::GetCountFile(char* path,char* mask)
{
    WIN32_FIND_DATA FileData;
    HANDLE hSearch;
    
    char NewPath[MAX_PATH];
    char fpath[MAX_PATH];
    
    strcpy(fpath,path);
    strcat(fpath,"\\");
    strcat(fpath,mask);
    
    if(hSearch=FindFirstFile(fpath,&FileData))
    {
        if(!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(FileData.cFileName,"..") && strcmp(FileData.cFileName,"."))
            {
              if (PosNoCase(ExtractFileExt(FileData.cFileName, ext), "htm") || PosNoCase(ExtractFileExt(FileData.cFileName, ext), "php") || (((CString)ExtractFileExt(FileData.cFileName, ext) == ".js") && m_chCleanJSFiles.GetCheck())) // || (ExtractFileExt(FileData.cFileName) == NULL)
              {
                  CountFindFiles++;
              }
            }
        while(FindNextFile(hSearch,&FileData))
            {
            if(!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(FileData.cFileName,"..") && strcmp(FileData.cFileName,"."))
                {
                  if (PosNoCase(ExtractFileExt(FileData.cFileName, ext), "htm") || PosNoCase(ExtractFileExt(FileData.cFileName, ext), "php") || (((CString)ExtractFileExt(FileData.cFileName, ext) == ".js") && m_chCleanJSFiles.GetCheck())) 
                  {
                      CountFindFiles++;
                  }
                }
            }
    }
        

    FindClose(hSearch);//поиск файлов закон?или, теперь ищем подпапки
    strcpy(fpath,path);
    strcat(fpath,"\\*.*");

    if(hSearch=FindFirstFile(fpath,&FileData))
    {
        if((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(FileData.cFileName,"..")&&strcmp(FileData.cFileName,"."))
            {
            strcpy(NewPath,path);
            strcat(NewPath,"\\");
            strcat(NewPath,FileData.cFileName);
            GetCountFile(NewPath,mask);     //ЭТО НАЗЫВАЕТСЯ "РЕКУРСИЯ"
            }
        while(FindNextFile(hSearch,&FileData))
            {
            if((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(FileData.cFileName,"..")&&strcmp(FileData.cFileName,"."))
                {
                strcpy(NewPath,path);
                strcat(NewPath,"\\");
                strcat(NewPath,FileData.cFileName);
                GetCountFile(NewPath,mask); //ЭТО НАЗЫВАЕТСЯ "РЕКУРСИЯ"
                }

            }
    }
}
//-------------------------------------------------------------------------------------

char* CClearSiteDlg::ExtractFileExt(const char* FileName, char *ext) 
{ 
    char dummy[_MAX_PATH]; 
    _splitpath( FileName, dummy, dummy, dummy, ext ); 
    return ext;
}
//-------------------------------------------------------------------------------------

bool CClearSiteDlg::PosNoCase(char* S, char* Substr) 
{ 
  if (strstr( _strlwr( _strdup(S)), Substr) == NULL) return false;
  else return true;
}
//-------------------------------------------------------------------------------------
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.