Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129

Средний размер для каждой группы файлов - рекурсивно

21.01.2013, 22:10. Показов 2966. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер,подскажите пожалуйста, как реализовать задачу?
Осталось сделать следующее:
Определить средний размер для каждой группы файлов (группировать по расширению и отдельной строкой - для всех) - рекурсивно по всей папке
На данный момент прога подсчитывает общее количество папок,файлов,размер выбранной папки.
Делаю так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void DirSize(AnsiString Folder,__int64 &Size,int &fCount,int &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)
               {
                  FolderSize(Folder+"\\"+SR.Name,Size,fCount,folCount);
                  folCount++;
               }
            else
               {
                  
                  Size = Size + SR.Size;
                  fCount++;
               }
         }
      }
   while(FindNext(SR)==0);
    FindClose(SR);
  }
Использую так:
C++
1
2
3
4
5
6
 __int64 a =0 ;
 int b = 0, c = 0; 
  FolderSize("E:\\delphi",a,b,c); // Вообще здесь результат выбора папки DirectoryListBox
  ShowMessage (a); // Размер папки в байтах.
  ShowMessage (b); // Общее количество файлов в папке.
  ShowMessage (c); // Общее количество подпапок.

Можно таким образом вычислить средний размер
std::hash_map, где ключами будут строки с расширением файла, а значениями - размер
Но дальше не знаю как доделить?Точнее в свой код не могу привентить.
Подскажите как сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.01.2013, 22:10
Ответы с готовыми решениями:

Сгруппировать файлы по расширениям и для каждой группы вывести суммарный размер файлов
Подскажите а как можно сгруппировать файлы по расширениям и для каждой группы вывести суммарный размер всех файлов в ней?

Вычислить суммарный размер файлов в килобайтах и средний размер файла
Нужно составить программу с помощью которой с клавиатуры вводятся размер 6 файлов в байтах(от 100 до 2000) и вычисляет суммарный размер...

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

32
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
29.01.2013, 16:57  [ТС]
Студворк — интернет-сервис помощи студентам
Avazart,
Да, оказывается путь указывал не правильно т.е. c:\dbf\ а нужно c:/dbf/.
Неудобно блин....
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2013, 19:06
Ну у меня нормально вроде схватывает может про двойные слеши забыли ?
Миниатюры
Средний размер для каждой группы файлов - рекурсивно  
0
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
29.01.2013, 23:31  [ТС]
Avazart,
Да вполне может быть....я же запускал консольку, которую Вы прикладывали,там работает всё.
А ваш проект так и не могу запустить.
так и говорит прога не могу подключить boost/filesystem из файла my_findfiles.h

Добавлено через 1 минуту
в 16 посте
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2013, 01:19
Ну другой пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//---------------------------------------------------------------------------
__fastcall TForm5::TForm5(TComponent* Owner)
    : TForm(Owner)
{
Edit1->Text= GetCurrentDir();
}
//---------------------------------------------------------------------------
void __fastcall TForm5::Button1Click(TObject *Sender)
{
fs::path p = ( AnsiString(Edit1->Text).c_str()  );
 
std::vector< fs::path > files;
 
std::copy( fs::directory_iterator(p), fs::directory_iterator(),
                                 std::back_inserter(files) );
 
std::vector< fs::path > :: iterator it;
for(it=files.begin();it!=files.end();++it)
     Memo1->Lines->Add( it->native_file_string().c_str() );
}
//---------------------------------------------------------------------------
Миниатюры
Средний размер для каждой группы файлов - рекурсивно  
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2013, 03:55
Забыл только отлов исключений добавить
C++
1
2
3
4
5
6
7
8
9
try
    {
std::copy( fs::directory_iterator(p), fs::directory_iterator(),
                                 std::back_inserter(files) );
    }
catch(const std::exception &e)
    {
        Memo1->Lines->Add( e.what() );  
    }
0
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
30.01.2013, 12:42  [ТС]
Avazart,
работает.
может заработает если в основном блоке прописать описание класса ff_t ?


Можно такой ещё вопрос? Если нужно вычислить размер каждого типа, как лучше сделать?
Я думаю так:
Прохожу по всем папкам,имеется например Вектор с файлами, имена файлов заношу в какой нить ЛистБокс/мемо итд, а потом пробегаюсь по этому списку и работаю с именами, т.е. разделяю расширение с основным именем.

Добавлено через 3 минуты
Или по другому можно сделать?используя boost?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2013, 13:46
Ну можно
1. Накоплять файлы в std::vector<fs::path> затем применять алгоритм std::count_if c разными функтурами по интересующим расширениям. Тут главное что бы количество файлов не превысило размер файла.
2. А второй вариант написать свою ф-цию подсчета, c фиксацией расширения и кол-ва файлов в std::map

Добавлено через 1 минуту
Цитата Сообщение от denis_stell Посмотреть сообщение
ожет заработает если в основном блоке прописать описание класса ff_t ?
Я не помню что там, там по моему левые пути прописаны в файле проекта из-за этого бока а не из-за самого кода.
0
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
30.01.2013, 13:48  [ТС]
а у Вас в 22 посте скрин проги вашей "Поиск по шаблону", у вас там считает количество и размер.
Можете перезалить куда-нить?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2013, 13:52
Там размер не считается.
0
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
30.01.2013, 14:00  [ТС]
Avazart,
См.вложение
Миниатюры
Средний размер для каждой группы файлов - рекурсивно  
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2013, 14:50
А ну хз давно писал...

Размер можно получить ф-цией fs::path() от fs::path- файла, расширение файла через fs::extension()

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//---------------------------------------------------------------------------
void __fastcall TForm5::Button1Click(TObject *Sender)
{
fs::path p = fs::current_path();
 
Caption= p.native_file_string().c_str();
 
std::vector< fs::path > files;
 
std::copy( fs::recursive_directory_iterator(p), fs::recursive_directory_iterator(),
                                 std::back_inserter(files) );
 
 
std::vector< fs::path > :: iterator it;
for(it=files.begin();it!=files.end();++it)
    {
        String Info;
        if( !fs::is_directory(*it ) )
         {
             Info+= "["+String( fs::extension(*it).c_str() )+"]\t";
             Info+= String( fs::file_size(*it) );
         }
        else Info= "-\t-";
 
        Memo1->Lines->Add( String(it->leaf().c_str())+"\t"+Info);
     }
}
//---------------------------------------------------------------------------
Вывод в Memo
Debug_Build - -
Project5.#00 [.#00] 4838445
Project5.obj [.obj] 34772
Project5.pch [.pch] 20453918
Unit5.obj [.obj] 665679
Project5.cbproj [.cbproj] 9176
Project5.cpp [.cpp] 870
Project5.exe [.exe] 289792
Project5.map [.map] 246
Project5.otares [.otares] 96
Project5.pdi [.pdi] 24
Project5.res [.res] 5560
Project5.tds [.tds] 7733248
Project5_Icon.ico [.ico] 4286
Project5_Icon1.ico [.ico] 4286
Unit5.cpp [.cpp] 1244
Unit5.dfm [.dfm] 632
Unit5.h [.h] 827
0
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
30.01.2013, 14:53  [ТС]
Avazart,
спасибо
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2013, 17:22
Если "пути" хранить не нужно то что бы не занимать лишнюю память можно заносить размеры и кол-во файлов в std::map<>.

Добавлено через 2 часа 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//---------------------------------------------------------------------------
class info
{
  private:
        unsigned __int64 size;
        unsigned __int64 count;
 
  public:
    void add( unsigned __int64 _size )
        {
            size+= _size;
            count++;
        };
 
    unsigned __int64 average_size()const {  return  size/count;  }
    unsigned __int64 get_size() const {  return  size;  }
    unsigned __int64 get_count()const {  return  count;  }
};
//---------------------------------------------------------------------------
void calc(fs::recursive_directory_iterator first,
                    fs::recursive_directory_iterator last, std::map<std::string,info>& mi)
{
    for(;first!=last; ++first)
     {
            if(!fs::is_directory(*first))
                {
                    mi[fs::extension(*first)].add( fs::file_size(*first) );
                }
     }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
std::map<std::string,info> mi;
 
fs::path p = fs::current_path();
 
calc( fs::recursive_directory_iterator(p), fs::recursive_directory_iterator(),mi);
 
std::map<std::string,info>:: iterator it;
 
for(it=mi.begin(); it!=mi.end(); ++it)
    {
 
        Memo1->Lines->Add( String(it->first.c_str() )+"\t"+
                                             String(it->second.get_size() )+" / "+
                                             String( it->second.get_count() )+" = "+
                                             String(it->second.average_size() )
                                         );
     }
}
//---------------------------------------------------------------------------
Вывод в Memo:
.#00 9676890 / 2 = 4838445
.cbproj 12958 / 1 = 12958
.cpp 3711 / 2 = 1855
.dfm 802 / 1 = 802
.exe 304128 / 1 = 304128
.h 896 / 1 = 896
.local 1286 / 1 = 1286
.map 246 / 1 = 246
.obj 2237653 / 4 = 559413
.pch 20453918 / 1 = 20453918
.res 5560 / 1 = 5560
.tds 8781824 / 1 = 8781824
.~1~ 6054 / 6 = 1009
.~2~ 3940 / 4 = 985
.~3~ 2241 / 2 = 1120
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2013, 17:22

Средний бал для группы студентов (Средний бал всей группы)
Помогите, пожалуйста, написать программу для вычисления среднего балла всей группы студентов, у меня беда с программированием, а препод...

Подсчитать средний бал каждой группы
Подсчитать средний бал каждой группы. Сформировать список, в котором группы данного курса располагаются по убыванию среднего бала. Список...

Определить средний возраст студентов каждой группы
Помогите с задачей Известен возраст (в годах в виде 16,5 лет и т. п.) каждою студента двух групп колледжа. Определить средний возраст...

Вычислить средний балл группы и вывести на экран список студентов имеющих средний балл выше среднего балла группы
Написал задачку, а она как то не робит(( Нуждаюсь в опытном совете.... Вот условие задачи: &quot;Вычислить средний балл группы и...

Вычислить средний балл группы и распечатать список студентов, имеющих средний балл выше среднего балла группы
Здраствуйте ещё раз :) Скажу сразу честно толком не пробывал решать с Записями и в особенности вот эти задачи... если поможите буду очень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru