Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создания интерфейса для поиска файлов, Создание интерфейса для поиска файлов... 
:(
    Опции темы
julianusti
  Дата 28.8.2007, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 23.8.2007
Где: Украина, Львов

Репутация: нет
Всего: нет



Создания интерфейса для поиска файлов на локальной машине за заданым именем, форматом файла...

vector<string> Find(string fileName )

как реализовать ?...помогите пожалуйста.
PM MAIL ICQ   Вверх
SenkraD
Дата 29.8.2007, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 4
Всего: 23



julianusti, а что поиском пользоватся не умеем - тема частая (переодически).
Вот тебе пример с MSDN (WinAPI):
Код

#define _WIN32_WINNT 0x0501

#include <windows.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind = INVALID_HANDLE_VALUE;
   char DirSpec[MAX_PATH];  // directory specification
   DWORD dwError;

   printf ("Target directory is %s.\n", argv[1]);
   strncpy (DirSpec, argv[1], strlen(argv[1])+1);
   strncat (DirSpec, "\\*", 3);

   hFind = FindFirstFile(DirSpec, &FindFileData);

   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("Invalid file handle. Error is %u\n", GetLastError());
      return (-1);
   } 
   else 
   {
      printf ("First file name is %s\n", FindFileData.cFileName);
      while (FindNextFile(hFind, &FindFileData) != 0) 
      {
         printf ("Next file name is %s\n", FindFileData.cFileName);
      }
    
      dwError = GetLastError();
      if (dwError == ERROR_NO_MORE_FILES) 
      {
         FindClose(hFind);
      } 
      else 
      {
         printf ("FindNextFile error. Error is %u\n", dwError);
         return (-1);
      }
   }
   return (0);
}


А если конкретно по твоей задаче, то:
1. Определи количество дисков на локальной машине  и их корневые папки (_getdrive, _chdrive, _getdcwd)
2. Перепиши функцию так, чтобы она работала рекурсивно. (Лучше не возвращай vector, а передавай его как входной параметр, по ссылке)
3. Вызови модифицированную функу для все дисков (Будь внимателен с "флопом" и CD/DVD - нужно проверять есть ли в них носители, иначе будет горе)

P.S. В MFC есть обёртка для поиска файлов - CFileFind
P.S.P.S. Появятся новые вопросы - спрашивай, а первая строчка - это совет, на будущее

Это сообщение отредактировал(а) SenkraD - 29.8.2007, 07:46


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
julianusti
Дата 29.8.2007, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 23.8.2007
Где: Украина, Львов

Репутация: нет
Всего: нет



Спасибо большое  за подсказку....буду работать. Делав том что я в мсдн был и этот пример уже видел и даже запускать пробывал  smile  Просто мне нужно через вектор это все делать ну так как я написал : vector<string> Find(string fileName ) У меня опыта мала в этом деле вот и спрашиваю "путь" у Вас куда и как мне двигатся. 


Еще раз спасибо.


vector<string> Find( string fileName )

Performs search for specified in constructor drive for files named fileName. Returns vector of found files. Each vector element – file name with fully specified path.
Note: method blocks until search is complete.


Вот конкретно условия. 



Это сообщение отредактировал(а) julianusti - 29.8.2007, 07:59
PM MAIL ICQ   Вверх
zkv
Дата 29.8.2007, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Цитата(julianusti @  29.8.2007,  07:56 Найти цитируемый пост)
vector<string> Find( string fileName )

офигеть чему учат - вектор строк по значению передавать  smile 

Цитата(julianusti @  29.8.2007,  07:56 Найти цитируемый пост)
Вас куда и как мне двигатся. 

тебе все показали
Цитата(julianusti @  29.8.2007,  07:56 Найти цитируемый пост)
Просто мне нужно через вектор это все делать ну так как я написал : vector<string> Find(string fileName )

так и функций в программе может быть больше одной (модифицированное высказывание bsa smile), сделай рекурсивный служебный метод (или методы), вызывай его из своей функции Find(), 
только в них хотя бы по ссылке вектор передавай

Это сообщение отредактировал(а) zkv - 29.8.2007, 08:20
PM MAIL   Вверх
SenkraD
Дата 29.8.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 4
Всего: 23



julianusti, держи (было время - поигрался), но тебе это лучше распаралелить уж очень лолго по всей машине искать будет
zkv, согласен в том, что нужно по ссылке передавать

Код

// STL
#include <vector>
#include <string>

// CRT
#include <direct.h>

// Directives
using namespace std;

// Вспомагательная функция
void GetDrivesDirs(vector<string> &vectorDirs)
{

    int    nDrive;
    int    nCurDrive;
    char   szPath[4];

    // Save current drive
    nCurDrive = _getdrive();
    
    // Get Driver Dirs
    vectorDirs.clear();
    for(nDrive = 1; nDrive <= 26; nDrive ++)
    {
         if(!_chdrive(nDrive))
        {
            sprintf(szPath, "%c:\\", nDrive + static_cast<int>('A') - 1);
            vectorDirs.push_back(szPath);
        }
    }
    
    // Restore original drive
    _chdrive(nCurDrive);
}

// Рабочая лошадка
void FindRecursive(string strInitPath, string strFileName, vector<string> &refvectorResults)
{
    BOOL        bIsFinded;
    CFileFind    fileFinder;
    CString        strFindMask;
    CString        strBuffer;
    
    strFindMask.Format("%s*.*", strInitPath.c_str());
    bIsFinded = fileFinder.FindFile(strFindMask);
    while(bIsFinded)
    {

        bIsFinded = fileFinder.FindNextFile();
        if(fileFinder.IsDots())
        {
             continue;
        }
    
        if(fileFinder.IsDirectory())
        {
            strInitPath = fileFinder.GetFilePath().GetBuffer();
            strInitPath.append("\\");
            FindRecursive(strInitPath, strFileName, refvectorResults);
        }  
        else
        {
            if(!fileFinder.GetFileName().Compare(strFileName.c_str()))
            {
                strBuffer = fileFinder.GetFilePath();
                refvectorResults.push_back(strBuffer.GetBuffer(strBuffer.GetLength()));
            }
        }
    }

    fileFinder.Close ();
}

// Твоя функа
vector<string> Find(string strFileName)
{
    vector<string>    vectorResults;
    vector<string>    vectorDirs;
    
    GetDrivesDirs(vectorDirs);
    if(!vectorDirs.empty())
    {
        for(unsigned int i = 0; i < vectorDirs.size(); i ++)
        {
            FindRecursive(vectorDirs[i], strFileName, vectorResults);    
        }
    }

    return vectorResults;
}

// использование и отображение твоих результатов поиска
void CFindDemoDlg::OnBnClickedButton1()
{
    vector<string> vectorFindFiles;
    CListBox *pList = (CListBox *)GetDlgItem(IDC_LIST1);
    
    vectorFindFiles = Find(string("Test.txt"));
    if(!vectorFindFiles.empty())
    {
        for(unsigned int i = 0; i < vectorFindFiles.size(); i ++)
        {
            pList->AddString(vectorFindFiles[i].c_str());
        }
    }
}


Remarks:
 - Даная реализация не может искать по маске!!!
 - Местами не лучшая реализация (мне так показалось)
    - можно было б реализовать на WinAPI и не использовать CString
    - получить количество дисков тоже можно было б через API, а не через CRT
 - Нет проверки на наличие носителя в каком-либо дисководе
 - Не помешало б распарелить (один диск - один поток)

P.S. VC++ 2003 - Unicode отключён - работаем в ANSI

Это сообщение отредактировал(а) SenkraD - 29.8.2007, 10:42


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
julianusti
Дата 29.8.2007, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 23.8.2007
Где: Украина, Львов

Репутация: нет
Всего: нет



Спасибо большое, буду розбиратся... впринципе я бы использывал бы мсдн"овский пример, но таке задание...а я таким вообще не занимался...я пока что чайник, но стремительно учусь...еще раз благодарю за помощь!
PM MAIL ICQ   Вверх
NiJazz
Дата 30.8.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



Я чего-то не понимаю, или всё-таки здесь лучше использовать list<>,  а не vector<>?

Добавлено через 13 минут и 54 секунды
Ну или хотя бы сделать грамотный vector<>::reserve.
PM MAIL   Вверх
julianusti
Дата 19.9.2007, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 23.8.2007
Где: Украина, Львов

Репутация: нет
Всего: нет



SenkraD

Привет, еще раз спасибо за пример....я вот нидавно содился...и что то мне не вышло этот проект запустить....ты бы не мог мне на мыло его отправит... ?
 Зарание спасибо....хотелось бы розобратся с этим...і

мой е-майл: [email protected]



Это сообщение отредактировал(а) julianusti - 19.9.2007, 08:59
PM MAIL ICQ   Вверх
zkv
Дата 19.9.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Цитата(julianusti @  19.9.2007,  08:58 Найти цитируемый пост)
ты бы не мог мне на мыло его отправит...

лучше выкладывайте на форуме, возможно не только у тебя такая проблема
PM MAIL   Вверх
SenkraD
Дата 19.9.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 4
Всего: 23



julianustizkv, прицепил проект, но как написано вверху мной и NiJazz его ещё править нуно и нуно )))

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  FindDemo.rar 28,69 Kb


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
julianusti
Дата 20.9.2007, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 23.8.2007
Где: Украина, Львов

Репутация: нет
Всего: нет



Да над проектом нужно еще поработать...но всеравно лучше что то чем ничего.

SenkraD а ты бы не мог детальную бизнес логику описать проекта. Может еще какие-то полезные линки подкинишь ? 

спасибо  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0805 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.