На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Как поправить код,чтоб поиск продолжился и по другим подкаталогам,кроме первого?
    Добрый день!
    Программа должна находить первые 10 файловв текущем каталоге,и первом уровне подкаталогов через сеткаррентдиректори.
    Проблема возникает ,если в текущей директории и первом подкаталоге в общем меньше 10,нет выхода из первого подкаталога(крутится там),и нет перехода в следующий подкаталог и дувайл,ваил мне здесь не помогает.
    Если кто может помочь с тем чтоб поиск продолжался и по другим директориям,то заранее спасибо.
    ExpandedWrap disabled
      int main()
      {
          //searchAll();
          fileCreate();
          SetCurrentDirectory("D:\\");
          if (hFind != INVALID_HANDLE_VALUE) { search(); }          //poisk v papke
          hFindAll = FindFirstFile("*.*", &FindFileData);
          if ((hFindAll != INVALID_HANDLE_VALUE) &&  (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (counter < 10))
          {
              while (FindNextFile(hFindAll, &FindFileData) && (counter < 10))
              {      
       
              SetCurrentDirectory(FindFileData.cFileName);
              GetCurrentDirectory(sizeof(buffer), buffer);
              cout << "After change :  " << buffer << endl;
              search();//poisk v papke
              cout << "Loop if finished" << endl;
              }
          }
          FindClose(hFindAll);
          CloseHandle(hFile);
          readHTML();
          system("pause");
          return 0;
      }

    cкрин вывода
    Прикреплённая картинка
    Прикреплённая картинка
    Сообщение отредактировано: amigot -
      Может надо что-то вида:
      ExpandedWrap disabled
        {
            GetCurrentDirectory( len,  временная); // куда вернуться
            SetCurrentDirectory(FindFileData.cFileName); // заход
            ...
            search();
            ...
            SetCurrentDirectory(временная); //возврат
        }
        Славян
        СПАСИБО.
        Попробовал.
        Уже лучше ,возвращается откуда зашёл,но перехода в следующую нет.ПОлдела сделано.:-)
        ExpandedWrap disabled
          int main()
          {
              //searchAll();
              fileCreate();
              SetCurrentDirectory("D:\\");
              if (hFind != INVALID_HANDLE_VALUE) { search(); }//search in basic folder
              hFindAll = FindFirstFile("*.*", &FindFileData);
              if ((hFindAll != INVALID_HANDLE_VALUE) &&  (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (counter < 10))
              {
                  while (FindNextFile(hFindAll, &FindFileData) && (counter < 10))
                  {      
                  GetCurrentDirectory(sizeof(bufferTemp), bufferTemp);
                  SetCurrentDirectory(FindFileData.cFileName);
                  GetCurrentDirectory(sizeof(buffer), buffer);
                  cout << "After change :  " << buffer << endl;
                  search();
                  SetCurrentDirectory(bufferTemp);
                  cout << "Loop if finished" << endl;
                  }
              }
              FindClose(hFindAll);
              CloseHandle(hFile);
              readHTML();
              system("pause");
              return 0;
          }

        Прикреплённая картинка
        Прикреплённая картинка
        Сообщение отредактировано: amigot -
          Хм-м... наверное, не нужны были эти заходы да возвраты! Что-то такое получше:
          ExpandedWrap disabled
            while( FindNextFile(hFindAll, &FindFileData) && counter<10 )
            {      
            //GetCurrentDirectory(sizeof(bufferTemp), bufferTemp);
            if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) SetCurrentDirectory(FindFileData.cFileName); // сменим путь, если нам попался каталог!
            GetCurrentDirectory(sizeof(buffer), buffer);
            ...
            }


          Добавлено
          Хотя может получиться, что заходим в каталог, а потом идём в текущий ("."), а затем сразу выходим ("..").
          Короче, надо после очередного захода в каталог искать токмо с атрибутом НЕ КАТАЛОГ!
            Славян
            Спасибо.Не помогло ,тогда зацикливание остается ,не ифы в ваиле не помогают.
            Точка сохранения дает выйти из вайла.Но вот что делать дальше.
            И атрибут директориии прописан в ифе выше ,над вайлом.
            Сообщение отредактировано: amigot -
              Смотрите, какая схема для вашего случая:
              1. Ищем в заданном ТОЛЬКО файлы.
              2. Далее, ищем ТОЛЬКО каталоги (если файлов менее 10 оказалось).
              3. Заходим в каждый каталог, заранее запомнив точку захода.
              4. Ищем снова в найденном ТОЛЬКО файлы.
              5. Выходим, зная точку входа. И идём в п.2

              Так, у вас получится в точности ваше задание.
                Славян
                Вы абсолютно правы и абсолютно правильно всё поняли.
                Но это почему то не работает
                ExpandedWrap disabled
                  int main()
                  {
                      fileCreate();
                      SetCurrentDirectory("D:\\");
                      if (hFind != INVALID_HANDLE_VALUE) { search(); }//search in basic folder
                      hFindAll = FindFirstFile("*.*", &FindFileData);
                      if ((hFindAll != INVALID_HANDLE_VALUE) &&  (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (counter < 10))
                      {  
                          while (FindNextFile(hFindAll, &FindFileData) && (counter < 10))
                          {
                              GetCurrentDirectory(sizeof(bufferTemp), bufferTemp);//save tocki vhoda
                              SetCurrentDirectory(FindFileData.cFileName);//enter
                              GetCurrentDirectory(sizeof(buffer), buffer);
                              cout << "After change :  " << buffer << endl;
                              search();
                              SetCurrentDirectory(bufferTemp);//back to save
                              cout << "Loop is finished" << endl;
                          }
                      }
                      FindClose(hFindAll);
                      CloseHandle(hFile);
                      readHTML();
                      system("pause");
                      return 0;
                  }

                ExpandedWrap disabled
                  void search()
                  {
                      hFind = FindFirstFile("*.jpg*", &FindFileData);
                      do
                      {
                          if (counter < 10)
                          {
                              FileTimeToSystemTime(&FindFileData.ftCreationTime, &SystemTime);
                              printf("%s\t      %d.%d.%d \n", FindFileData.cFileName, SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear);
                              WriteFile(hFile, &FindFileData, sizeof(WIN32_FIND_DATA), &nb, NULL);
                              counter++;
                          }
                      } while (FindNextFile(hFind, &FindFileData));
                      FindClose(hFind);
                  }

                Прикреплённая картинка
                Прикреплённая картинка
                Сообщение отредактировано: amigot -
                  Ну так потому что у вас одна схема на всё! Сделайте 3 схемы, как я описал в пунктах (чтобы каждую можно было отладить, и убедиться, что работает) :
                  1-я) Ищет ТОЛЬКО файлы в заданном каталоге.
                  2-я) перебирает ТОЛЬКО каталоги.
                  3-я) ищет ТОЛЬКО файлы в каталоге, куда зашли из схемы №2.

                  И всего делов! Т.е. вам понадобится ДВЕ маски типа WIN32_FIND_DATA - одна для поиска каталогов, вторая - только для файлов.

                  П.С. 1) у вас же (в search) не видно разделения на файлы/каталоги, т.е. каталог TEST.JPG всё равно будет найден же и сосчитан?! Что неверно!
                  2) "if (counter < 10)" лучше вытащить перед вызовом search, а в том while убрать это в условие:
                  ExpandedWrap disabled
                    if (counter < 10)
                     search();
                    ...
                    do
                    {
                        FileTimeToSystemTime(&FindFileData_Files.ftCreationTime, &SystemTime);
                        printf("%s\t      %d.%d.%d \n", FindFileData_Files.cFileName, SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear);
                        WriteFile(hFile, &FindFileData_Files, sizeof(WIN32_FIND_DATA), &nb, NULL);
                        counter++;
                    }while( counter<10 && FindNextFile(hFind, &FindFileData_Files) );
                    Славян
                    Большое спасибо!
                    Попробую это исправить.Если получится.
                    Search поправил ,с остальным пробую реализовать.
                    Сообщение отредактировано: amigot -
                      Да, что-то тут не так. Виноват. У вас же всё равно идёт возврат в D:\ и система заново перебирает уже найденные файлы. Надо подумать. :blush:
                        Славян
                        Спасибо что помогаете.Я уже 4 дня с этим парюсь...........
                        Осталась какая то мелочь на виду...но вот что именно...
                        А может не выход а переход на след директорию или выход и вход в следующую,но как войти в следующую..
                        Может как то смену директории в цикл загнать..
                        Сообщение отредактировано: amigot -
                          У меня вот так ваша схема заработала:
                          ExpandedWrap disabled
                            #include <stdio.h>
                            #include <windows.h>
                            #include <iostream>
                             
                            WIN32_FIND_DATAW FindFileData;
                            unsigned counter = 0;
                            wchar_t bufferTemp[600], buffer[500];
                            SYSTEMTIME SystemTime;
                             
                            void search()
                            {
                                HANDLE hFind = FindFirstFile(L"*.exe*", &FindFileData);
                                if( hFind != INVALID_HANDLE_VALUE )
                                {
                                  do
                                  {
                                    if (counter < 30 && (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) )
                                    {
                                        FileTimeToSystemTime(&FindFileData.ftCreationTime, &SystemTime);
                                        wprintf(L"%s\t      %d.%d.%d \n", FindFileData.cFileName, SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear);
                            //            WriteFile(hFile, &FindFileData, sizeof(WIN32_FIND_DATA), &nb, NULL);
                                        counter++;
                                    }
                                  }while( FindNextFile(hFind, &FindFileData) );
                                  FindClose(hFind);
                                }
                            }
                             
                            int main()
                            {
                                SetCurrentDirectory(L"F:\\");
                                HANDLE hFindAll;
                                    search();//search in basic folder
                                hFindAll = FindFirstFile(L"*.*", &FindFileData);
                                if( hFindAll != INVALID_HANDLE_VALUE && counter<30 )
                                  do
                                  {
                                    //while( FindNextFile(hFindAll, &FindFileData) && (counter < 30) )
                                    if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
                                    {
                                        GetCurrentDirectory(sizeof(bufferTemp), bufferTemp);//save tocki vhoda
                                        if( SetCurrentDirectory(FindFileData.cFileName) )//enter
                                        {
                                            GetCurrentDirectory(sizeof(buffer), buffer);
                                            std::cout << "After change :  " << buffer << std::endl;
                                            search();
                                            SetCurrentDirectory(bufferTemp);//back to save
                                            std::cout << "Loop is finished" << std::endl;
                                        }
                                    }
                                  }while( FindNextFile(hFindAll, &FindFileData) );
                                FindClose(hFindAll);
                                //CloseHandle(hFile);
                            }
                            Славян
                            Спасибо попробую
                              amigot, на тебе работающую заготовочку, но она только для С++17:

                              ExpandedWrap disabled
                                #include <iostream>
                                #include <filesystem>
                                 
                                using namespace std;
                                namespace fs = std::filesystem;
                                 
                                const int MAX_D_LEVEL = 3; // как глубоко сканировать структуру каталогов
                                const int MAX_D_COUNT = 3; // какое максимальное количество каталогов проходить в текущем
                                const int MAX_F_COUNT = 4; // какое максимальное количество файлов учитывать в текущем
                                 
                                void SearchFiles(std::string iDir, int iLevel) {
                                  int DCnt = 0;
                                  int FCnt = 0;
                                  std::cout << "d: " << iDir << std::endl;
                                  for(auto& p: fs::directory_iterator(iDir)) {
                                    if (p.is_directory()) {
                                      if ((iLevel+1 == MAX_D_LEVEL)      ||
                                          (DCnt == MAX_D_COUNT)          ||
                                          (p.path().filename() == ".")   ||
                                          (p.path().filename() == "..")) continue;
                                      SearchFiles(iDir+"\\"+p.path().filename().u8string(), iLevel+1);
                                      DCnt++;
                                      continue;
                                    }
                                    if (p.is_regular_file()) {
                                      if (FCnt == MAX_F_COUNT) continue;
                                      std::cout << "f: " << iDir << "\\" << p.path().filename().u8string() << std::endl;
                                      FCnt++;
                                    }
                                  }
                                }
                                 
                                int main() {
                                  SearchFiles("C:\\Temp",0);
                                  return 0;
                                }
                                Славян
                                Спасибо!
                                За помощь ! Заработало!!!!!!!!!!!!!!!!!!!!!!!!!!!
                                Ура!!!!!!!!!!!!!!
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0914 ]   [ 21 queries used ]   [ Generated: 16.04.24, 17:28 GMT ]