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

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

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

Author24 — интернет-сервис помощи студентам
Добрый вечер,подскажите пожалуйста, как реализовать задачу?
Осталось сделать следующее:
Определить средний размер для каждой группы файлов (группировать по расширению и отдельной строкой - для всех) - рекурсивно по всей папке
На данный момент прога подсчитывает общее количество папок,файлов,размер выбранной папки.
Делаю так
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2013, 22:10
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 1 минуту
в 16 посте
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2013, 01:19 24
Ну другой пример
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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2013, 03:55 25
Забыл только отлов исключений добавить
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
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
30.01.2013, 12:42  [ТС] 26
Avazart,
работает.
может заработает если в основном блоке прописать описание класса ff_t ?


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

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

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

Размер можно получить ф-цией 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
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
30.01.2013, 14:53  [ТС] 32
Avazart,
спасибо
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2013, 17:22 33
Если "пути" хранить не нужно то что бы не занимать лишнюю память можно заносить размеры и кол-во файлов в 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
30.01.2013, 17:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2013, 17:22
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru