Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33

Как посчитать сколько на указанном пользователем диске всего файлов и папок?

03.10.2016, 17:28. Показов 2025. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дело такое: нужно как-то посчитать сколько на указанном пользователе диске всего файлов и папок.

C++
1
2
3
4
5
6
7
8
9
10
11
CHAR NamesDIrectory[4200];
 
        NamesDIrectory[0] = UserNameDisk[0];
        NamesDIrectory[1] = ':';
        NamesDIrectory[2] = '\\';
        NamesDIrectory[3] = '\\';
        NamesDIrectory[4] = '*';
        NamesDIrectory[5] = '\0';
 
 
        poisk(NamesDIrectory); // Поиск файлов и папок
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
void poisk(LPCSTR NamesDIrectory)
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hf;
 
    int AmountDIRECTORY = 0;
    int AmountENCRYPTED = 0;
    int AmountNORMAL = 0;
 
 
 
 
 
    hf = FindFirstFile(NamesDIrectory, &FindFileData);
    if (hf != INVALID_HANDLE_VALUE)
    {
        do
        {
            if (FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
            {
/*
 
Тут будем творить чудеса
 
*/
                AmountDIRECTORY++;
            }
 
            //cout << FindFileData.cFileName << endl;
            //cout << FindFileData.dwFileAttributes << endl;
 
 
 
            
 
        } while (FindNextFile(hf, &FindFileData) != 0);
        FindClose(hf);
    }
 
    cout << "Папок в данном каталоге: " << AmountDIRECTORY << endl;
    
}
Идея была такова. При помощи функции FindFirstFile я могу просмотреть список файлов в указанном каталоге. Но она не считает файлы находящиеся в этих же папках. Делается все при помощи рекурсии. Т.е., когда атрибут файла - папка, начинается рекурсия, мы изменяем адрес, дописав в нем название папки, и так само проверяем что в ней есть. В плоть до того, пока в конечной папке не будет папок =). И делаем шаг назад.

Знаю, звучит трудно, может и глупо, но других вариантов в голу не пришло.
Если есть у кого идеи, или знает способ иной, то подскажите, буду рад легшему способу.

P.S. было бы хорошо, еще посчитать память, что занимают все файлы.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.10.2016, 17:28
Ответы с готовыми решениями:

Подсчет и вывод объема всех скрытых файлов на диске, указанном пользователем
Помогите пожалуйста! Нужно написать скрипт wsh, который производит подсчет и вывод объема всех скрытых файлов на диске, указанном...

Подскажите как получить список всех папок и файлов на диске С
Подскажите как получить список всех папок и файлов на диске С ?

Поиск файлов на диске, за исключением скрытых файлов и папок
Часть кода, желательно использовать её. DirectoryInfo Di = new DirectoryInfo(@&quot;F:&quot;); foreach (FileInfo FileInfo in...

17
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.10.2016, 18:24
Ну а рекурсия, что, не работает?
0
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
03.10.2016, 19:14  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Ну а рекурсия, что, не работает?
Я то и подумал про нее, но разве нет легче способа?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.10.2016, 19:54
Рекурсия - достаточно простой способ.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.10.2016, 20:15
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Если есть у кого идеи, или знает способ иной, то подскажите, буду рад легшему способу.
"Очевидное" решение - распарсить вывод df -i, исходя из идеи что каждый файл и папка кушают по одному inode.
Но если под Винду, на NTFS и без симлинков, то рекурсия.
1
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
04.10.2016, 21:23  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Но если под Винду, на NTFS и без симлинков, то рекурсия.
Может кто подскажет как для сего сотворить рекурсию, а то с ними почти не работал =(
Принцип я то понял, но некоторые моменты не могу состыковать.
Например: начальный адрес у переменной "c:\\*", натыкается поисковик на папку, и добавляет имя папки к адресу, т.е. выйдет "c:\\папка\\*" , и так пойдем дальше пока не закончатся папки. После функция делает следующий шаг по предыдущему адресу или уже по измененному?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.10.2016, 22:49
Цикл создаёшь по папкам в текущей и делаешь вызовы.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
05.10.2016, 10:07
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Может кто подскажет как для сего сотворить рекурсию, а то с ними почти не работал =(
Так и организовать. На входе у функции путь к обрабатываемой папке. Она идет по содержимому папки и плюсует счетчик файлов. Например, оформленный как глобальная переменная. Если функция натыкается на папку - вызывает саму себя с адресом папки. А потом едет по содержимому папки дальше.
Ну а код набивайте сами.
1
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
05.10.2016, 18:51  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Если функция натыкается на папку - вызывает саму себя с адресом папки.
Я не могу понять как передать в функцию адрес папки на которую мы наткнулись, точнее сказать никакие действия не помогают. Ведь в начальную функцию мы передаем переменную типа чар,

C++
1
2
3
CHAR NamesDIrectory[4200];
 
poisk(NamesDIrectory);
Но функция FindFirstFile требует в качестве адреса переменную типа LPCSTR.
C++
1
void poisk(LPCSTR NamesDIrectory)
Есть идея, просто предыдущий адрес копировать в новую переменную и его объеденить с именем уже открытой папки, но не получается ни в какую все из-за константы =(
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
05.10.2016, 19:14
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Есть идея, просто предыдущий адрес копировать в новую переменную и его объеденить с именем уже открытой папки, но не получается ни в какую все из-за константы =(
И какие проблемы с константой? Никто не запрещает использовать не константный объект там, где требуется константа. Нельзя делать наоборот.
0
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
05.10.2016, 20:19  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
И какие проблемы с константой? Никто не запрещает использовать не константный объект там, где требуется константа. Нельзя делать наоборот.
Вот попробовал сделать рекурсию. Сделал переменную в которую копирую имя старого пути + имя открытой папки. Потом передаю его в эту же самую функцию но получаю ошибку =(
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
void poisk(LPCTSTR NamesDIrectory)
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hf;
 
    int AmountDIRECTORY = 0;
    int AmountENCRYPTED = 0;
    int AmountNORMAL = 0;
    char tymeName[30];
    int tymeA;
 
 
    hf = FindFirstFile(NamesDIrectory, &FindFileData);
    if (hf != INVALID_HANDLE_VALUE)
    {
        do
        {
            if (FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
            {
                
 
                for (int i = 0; i < 4201; i++)
                    {
                        //Копируем старый адресс в новую переменную до знака *
                        if (NamesDIrectory[i] != '*')
                        {
                            tymeName[i] = NamesDIrectory[i];
                        }
                        else
                        {
                            tymeName[i] = '\0';
                            tymeA = i;
                            break;
                        }
                    }
                
                
                for (int i = 0; i < 4201; i++)
                {       
                    //против корзины
                    if (FindFileData.cFileName[0] == '$')
                    {
                        tymeName[i] = '\0';
                        break;
                    }
                    
                    //добавляем к старому адресу имя папки
                    //
                    if (FindFileData.cFileName[i] != '\0')
                    {
                        tymeName[i + tymeA] = FindFileData.cFileName[i];
                    }
                    else
                    {
                        tymeName[i + tymeA] = '\\';
                        tymeName[i + 1 + tymeA] = '\\';
                        tymeName[i + 2 + tymeA] = '*';
                        tymeName[i + 3 + tymeA] = '\0';
                        break;
                    }
                } 
 
                ++AmountDIRECTORY;
                //cout << tymeName << endl;
                poisk(tymeName);
 
            }
 
            //cout << endl << FindFileData.cFileName << endl << endl;
            //cout << FindFileData.dwFileAttributes << endl;
 
 
 
            if (FindFileData.dwFileAttributes&FILE_ATTRIBUTE_NORMAL)
                AmountNORMAL++;
 
        } while (FindNextFile(hf, &FindFileData) != 0);
        FindClose(hf);
    }
 
    cout << "Папок в данном каталоге: " << AmountDIRECTORY << endl;
    
}
Миниатюры
Как посчитать сколько на указанном пользователем диске всего файлов и папок?  
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.10.2016, 20:28
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
нужно как-то посчитать сколько на указанном пользователе диске всего файлов и папок.
Получить вывод Dir в программу


грамотный рекурсивный обход всей файловой системы должен предполагать наличия ссылок.
и учитывать это.
иначе возникает ненулевая вероятность,
что программа впадет в вечный цикл.

а в случае с рекурсивным алгоритмом,
это неизбежно приведет к переполнению стека,
и краху программы.
0
59 / 59 / 53
Регистрация: 05.05.2013
Сообщений: 150
05.10.2016, 20:38
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
но получаю ошибку =(
у вас char tymeName[30] - массив в 30 элементов,
а в циклах максимальный индекс массива установлен в 4201,
там программа выходит за пределы массива и компилятор об этом говорит.
0
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
05.10.2016, 20:42  [ТС]
Цитата Сообщение от VAN0 Посмотреть сообщение
у вас char tymeName[30] - массив в 30 элементов,
Это уже исправил, сам уменьшил, и забыл вернуть

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
что программа впадет в вечный цикл.
программа ушла в никуда, я так понял пошло зацикливание
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
05.10.2016, 20:43
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Вот попробовал сделать рекурсию. Сделал переменную в которую копирую имя старого пути + имя открытой папки. Потом передаю его в эту же самую функцию но получаю ошибку =(
Я же сказал - "нельзя делать наоборот". Ваша функция должна принимать CHAR* и пихать в FindFirstFile. А уже в процессе пихания оно превратится в LPCSTR.
0
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
05.10.2016, 20:47  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Ваша функция должна принимать CHAR* и пихать в FindFirstFile.
Ну так я в нее и пихаю. Или то что я в нее пихаю все же не то?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
05.10.2016, 21:36
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Ну так я в нее и пихаю. Или то что я в нее пихаю все же не то?
А, пардон, проглючило, показалось что вы пытались в NamesDIrectory и старый путь хранить, и новый, а ошибка вылетала из-за попытки в константный NamesDIrectory писать. В этом случае как раз и надо было бы менять LPCSTR на входе функции на CHAR*. Теперь заметил что новый путь вы в отдельную переменную пишете.
0
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
05.10.2016, 22:57  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Теперь заметил что новый путь вы в отдельную переменную пишете.
Да, моя функция полностью заработала. Внес еще одну коррективу для пропуска некоторых моментов. Считает все точь в точь. Спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.10.2016, 22:57
Помогаю со студенческими работами здесь

Поиск указанных файлов на указанном диске и вывод результата на экран
Всем привет, я здесь впервые,и вот возник такой вопрос Для поиска файлов и выведения на экран я использую команду: dir c:\*.%1 /S /b |...

Найти суммарный размер всех файлов указанного типа на указанном диске
Скрипт, который находит суммарный размер всех файлов указанного типа на указанном диске.

Скрипт, который находит суммарный размер всех файлов указанного типа на указанном диске.
Скрипт, который находит суммарный размер всех файлов указанного типа на указанном диске. Вывод осуществляется на экран монитора (в окно...

Проверка наличия на диске в указанном каталоге перечисленных в списке файлов и вывод имен отсутствующих
Проверка наличия на диске в каталоге, указанном первым параметром КФ файла FNames.txt, содержащего список имен файлов и подкаталогов. Если...

Поиск файлов на диске с исключением папок
Такой вопрос: как это реализовать ? Есть рабочий код который нашел на просторах интернета, ищет файлы по маске, можно добавить много...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru