Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить размер группы файлов, размер файлов 
:(
    Опции темы
denisminb
Дата 20.1.2013, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.6.2012

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



Добрый вечер, помогите пожалуйста реализовать до конца задачу.
осталось, определить:
-средний размер для каждой группы файлов (группировать по расширению и отдельной строкой - для всех) - рекурсивно по всей папке.


Вычисляю размер файлов,папок,количество- так:
Код

void DirSize(AnsiString Folder,double &Size,double &fCount,double &folCount)
  {
  // Функция записывает в параметры:
  // Size - размер папки в байтах
  //fCount - общее количество файлов в папке
  //folCount - общее количество подпапок в папке

  TSearchRec SR;
  // Проверяем, заканчивается ли путь к папке на \,
  // если да, то удаляем его
  if(Folder[Folder.Length()] == '\\')
     Folder.SetLength(Folder.Length()-1);
  // Делаем первый поиск
  if(FindFirst(Folder+"\\*.*",faAnyFile,SR) == 0)
   do
      {   //Если то что мы нашли не является обратными ссылками...
         if(SR.Name != "." &&  SR.Name != "..")
         {
            
            if((SR.Attr & faDirectory)!=0)
               {
                 DirSize(Folder+"\\"+SR.Name,Size,fCount,folCount);
                  folCount++;
               }
            else
               {
                  
                  Size = Size + SR.Size;
                  fCount++;
               }
         }
      }
   while(FindNext(SR)==0);
    FindClose(SR);
  }



До конца,так и не могу решить задачу
PM MAIL   Вверх
volatile
Дата 20.1.2013, 23:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(denisminb @  20.1.2013,  23:00 Найти цитируемый пост)
средний размер для каждой группы файлов (группировать по расширению 

Это вам нужен какой-то массив.
В качестве оного, имхо, больше всего подойдет std::map, где ключами будут строки с расширением файла, а значениями - размер.

PM MAIL   Вверх
NoviceF
Дата 21.1.2013, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 smile хехе.. тестовое задание Esignal? Пол года назад мне так и не удалось организовать параллельное выполнение гуи и логики (не было знаний и время поджимало). Рекомендую вам обратить своё внимание в первую очередь на это, с потоками дружите?
PM MAIL   Вверх
denisminb
Дата 21.1.2013, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.6.2012

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



Цитата(NoviceF @ 21.1.2013,  08:43)
smile хехе.. тестовое задание Esignal? Пол года назад мне так и не удалось организовать параллельное выполнение гуи и логики (не было знаний и время поджимало). Рекомендую вам обратить своё внимание в первую очередь на это, с потоками дружите?

да,esignal.
с потоками средне дружу.
Вы в контору прошли?
PM MAIL   Вверх
denisminb
Дата 21.1.2013, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.6.2012

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



А без потоков как решить?

Добавлено через 10 минут и 4 секунды
volatile, 
А можете на не больщом примере показать,что имели ввиду?
PM MAIL   Вверх
NoviceF
Дата 21.1.2013, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(denisminb @  21.1.2013,  10:28 Найти цитируемый пост)
Вы в контору прошли? 

Нет.. к сожалению или к счатью, пока не знаю smile)

Цитата(denisminb @  21.1.2013,  11:55 Найти цитируемый пост)
А без потоков как решить?

Известными мне способами никак.. читайте в конце задания, что-то типа "интерфейс пользователя не должен замирать... бла бла бла", вот тут и нужна будет многопоточность. Я как смог сделал все пункты, кроме этого.. ну и ещё у меня русские пути в файловой системе не понимала программа, это, я считаю, была проблема Qt, с аглийскими путями всё прекрасно работало и даже гуи был, только в одном потоке с логикой.

Это сообщение отредактировал(а) NoviceF - 21.1.2013, 12:37
PM MAIL   Вверх
NoviceF
Дата 21.1.2013, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(denisminb @  21.1.2013,  11:55 Найти цитируемый пост)
А можете на не больщом примере показать,что имели ввиду? 


не знаю насколько это показательно.. и сделать конечно можно намного красивее и правильнее, но тем не менее просто покажу что когда-то делал я smile

Сначала проходим по всем путям нужной нам директории, и средствами Qt, а точнее вот такого класса QFileInfoList, пути сохраняем в QStringList datalist.
Проходим по QStringList datalist, выбирая только расришения, сохраняем их в set<std::string>.

Даём на вход функции map вида std::map<std::string, vector<std::string> > (тут у нас в итоге должны содержаться данные в виде: ключ - расширение файла, значения - пути к файлам) и set<std::string> содержащий расширения.

Код

typedef std::vector<std::string> stringlist;
typedef std::map<std::string, stringlist> maplist;

void listModel::initMapList(maplist &maplst, std::set<std::string> extlist,
        QStringList datalist) {
    maplst.clear();
    for (std::set<std::string>::iterator it = extlist.begin(); it != extlist.end();
            ++it) maplst[*it];
    for (QStringList::iterator it = datalist.begin(); it != datalist.end(); ++it) {

        size_t found;
        std::string ext;
        found = (*it).toStdString().find_last_of('.');
        ext = (*it).toStdString().substr(found);
        std::transform(ext.begin(), ext.end(), ext.begin(), tolower);

        maplst[ext].push_back((*it).toStdString());
    }

}


пысы, только не нужно пинать меня за стиль и приёмы, по сути был мой первый опыт что-то писать самостоятельно smile

Это сообщение отредактировал(а) NoviceF - 21.1.2013, 12:43
PM MAIL   Вверх
volatile
Дата 21.1.2013, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(denisminb @  21.1.2013,  10:55 Найти цитируемый пост)
можете на не больщом примере показать,что имели ввиду? 

создать ассоциативный контейнер, скажем
Код

std::map <std::string, long long> groups;

передать его по ссылке, в вашу функцию
Код

void DirSize(,..., std::map <std::string, long long> & groups)

в функции выделить расширение очередного файла в строковую переменную, скажем ext;
т.е. для для "prog.exe", ext должно быть "exe"
Ну и прибавлять размеры в группы:
Код

   groups [ext] += SR.Size; 

после возврата, в массиве groups будут суммы размеров файлов, сгруппированных по расширению.

***еще, пожалуй, std::string и AnsiString смешивать в одной програаме не стоит. Так что вибирайте сами.

 smile 
Цитата(denisminb @  21.1.2013,  09:28 Найти цитируемый пост)
Вы в контору прошли? 

если не секрет вы о какой конторе?

Добавлено через 4 минуты и 54 секунды
код NoviceF, не видел когда писал

PM MAIL   Вверх
NoviceF
Дата 21.1.2013, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(volatile @  21.1.2013,  14:04 Найти цитируемый пост)
если не секрет вы о какой конторе?


вот об этой eSignal http://hh.ru/employer/116364

Это сообщение отредактировал(а) NoviceF - 21.1.2013, 13:21
PM MAIL   Вверх
denisminb
Дата 21.1.2013, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.6.2012

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



Цитата(NoviceF @ 21.1.2013,  12:30)


Цитата(denisminb @  21.1.2013,  11:55 Найти цитируемый пост)
А можете на не больщом примере показать,что имели ввиду? 


не знаю насколько это показательно.. и сделать конечно можно намного красивее и правильнее, но тем не менее просто покажу что когда-то делал я smile

Сначала проходим по всем путям нужной нам директории, и средствами Qt, а точнее вот такого класса QFileInfoList, пути сохраняем в QStringList datalist.
Проходим по QStringList datalist, выбирая только расришения, сохраняем их в set<std::string>.

Даём на вход функции map вида std::map<std::string, vector<std::string> > (тут у нас в итоге должны содержаться данные в виде: ключ - расширение файла, значения - пути к файлам) и set<std::string> содержащий расширения.

Код

typedef std::vector<std::string> stringlist;
typedef std::map<std::string, stringlist> maplist;

void listModel::initMapList(maplist &maplst, std::set<std::string> extlist,
        QStringList datalist) {
    maplst.clear();
    for (std::set<std::string>::iterator it = extlist.begin(); it != extlist.end();
            ++it) maplst[*it];
    for (QStringList::iterator it = datalist.begin(); it != datalist.end(); ++it) {

        size_t found;
        std::string ext;
        found = (*it).toStdString().find_last_of('.');
        ext = (*it).toStdString().substr(found);
        std::transform(ext.begin(), ext.end(), ext.begin(), tolower);

        maplst[ext].push_back((*it).toStdString());
    }

}


пысы, только не нужно пинать меня за стиль и приёмы, по сути был мой первый опыт что-то писать самостоятельно smile

Да.....Qt я не знаю. Это точно.
Надо по другому думать
PM MAIL   Вверх
NoviceF
Дата 21.1.2013, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(denisminb @  21.1.2013,  14:57 Найти цитируемый пост)
Да.....Qt я не знаю. Это точно.
Надо по другому думать 


А GUI на чём планировал делать? Если MFC или подобные порождения MS, там свои функции есть для всех этих дел.
PM MAIL   Вверх
volatile
Дата 21.1.2013, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(denisminb @  21.1.2013,  13:57 Найти цитируемый пост)
Qt я не знаю

Qt здесь знать не нужно. Нужно знать std::map.
Это стандартный контейнер.
я вам написал без Qt, нужно только правильно рассавить строчки что я привел, в ваш код.
(и я как-то не вижу с вашей стороны попыток, это сделать)


PM MAIL   Вверх
Dem_max
Дата 22.1.2013, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Чтобы писать многопоточные приложения работающие с GUI под windows на QT нужно постараться, так как сигналы в QT организованны так что предусматривают блокировку потока GUI.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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