Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508

Файловый менеджер на чистом С + WinAPI

17.02.2014, 21:59. Показов 4970. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане)
Прошу у Вас помощи в написании программы, которая должна просматривать содержимое и навигация по всем локальным дискам и папкам, получать информацию про диск или папку, а именно размер, временные характеристики (время создания, редактирования), количество подкаталогов и файлов, а также по возможности всё остальное, но это уже не обязательно. Также программа должна обновлять информацию о папке/диске при изменении её/его содержании и выводить соответствующее сообщение.
Программа должна иметь графическую оболочку.

Кстати программа должна быть на чистом С с WinAPI.

Уйдя в предисторию скажу что у меня уже был опыт написания программы на ассемблере, которая читает даты создание, редактирования и открытия файла, там тоже был WinAPI.
В той программе я сначала использовал функцию CreateFile для получения доступу к файлу, указывал что делать с файлом, читать с него или писать в него и т. д. Затем вызывалась функция GetFileInformationByHandle для получения свойству файла. Потом вызывались функции FileTimeToLocalFileTime и FileTimeToSystemTime для преобразования времени в адекватный вид, потом вывод на экран.

Прочитав информацию про функцию CreateFile я обнаружил, что её также можно использовать для открытия директории.

Собственно несколько вопросов:
1) Стоит ли использовать функцию CreateFile или всё-же есть альтернатива по-лучше, если эта вдруг чем-то плоха для папок или дисков?
2) Какой аналог функции GetFileInformationByHandle есть для папок?
3) Одинакова ли работа с папкой и диском?
4) Есть ли какая-то функция или параметр к какой-то функции для подсчёта вложенных файлов и папок или нужно заходить в каждую папку отдельно и циклом считать кол-во файлов и папок?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.02.2014, 21:59
Ответы с готовыми решениями:

Файловый менеджер через winapi
Вобще задали сделать файловый менеджер. Начали учить winapi недавно. Он должен уметь следующее: 1.переместить - перемещает из одной...

Автозагрузка на чистом WINAPI
Код: program Project1; uses Windows; {$R *.res} var myRegPath :String =...

Файловый менеджер
Всем доброго времени суток! В делфи почти ноль, а писать программу надо ). Нужно написать файловый менеджер ). У меня есть...

28
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.02.2014, 23:05
Студворк — интернет-сервис помощи студентам
qwertun, правильно препод сказал, вы же API изучаете - т.е. низкий уровень - когда всё как на ладони и должны уметь с этим разбираться, а не пользоваться всякими VisualStudio примочками.
Окна без файла ресурсов
Вот вам топик, прежде чем я сделал то о чём речь - было так же очень много тухлых помидоров со стороны недобросовестных "недопрограммистов" =)
Наслаждайтесь готовым кодом. Только раз уж вас обучает такой крутой препод, тогда готовьтесь что дальше - будет тяжелее, поэтому советую разобрать код по косточкам сразу, чтоб потом не было "не обратил внимания" =)
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
28.02.2014, 10:34  [ТС]
Izual, огромное спасибо! Буду разбираться!
К сожалению это не решает одну важную проблему - ListView
0
 Аватар для Casper!
15 / 14 / 2
Регистрация: 02.09.2008
Сообщений: 168
01.03.2014, 08:07
я посмотрел , код сделан офигено, и там все понятно , попробуи там поинтересоватся , в чем он компилирует
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
02.03.2014, 16:15
qwertun, держите линк на пример ListView в VS2005.
Процедура обработки дочернего окна (ListView и Edit)
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
03.03.2014, 11:42  [ТС]
Izual, я с выше приведённой Вами темы взял проект и скомпилировал, всё прошло успешно, но линковщик сказал следущее: "LINK : warning LNK4199: параметр /DELAYLOAD:OleAcc.dll игнорируется; не найдены операции импорта из OleAcc.dll"
Хотелось бы узнать что это такое.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
03.03.2014, 16:00
qwertun, пробовали гуглить?.. видимо нет.
Вы не подключили к проэкту библиотеки.
Project Properties -> Linker -> Input -> Additional dependecies: gdi32.lib comctl32.lib

И ещё: Configuration Properties -> General:
Use MFC in static library.
Use multibyte character set
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
10.03.2014, 17:32  [ТС]
Цитата Сообщение от NickoTin Посмотреть сообщение
Перечисление файлов/папок в папке можно осуществить с помощью функции FindFirstFile(Ex).
Ну вобщем я попытался сделать и у меня вышла какаето лажа
C
1
2
3
4
5
6
7
8
9
10
11
12
13
WIN32_FIND_DATA wfd;
HANDLE hFirstFile;
int nFilesCount = 0;
hFirstFile = FindFirstFile("D:\\Programmes\\EasyCleaner\\*.*", &wfd);
if (hFirstFile != INVALID_HANDLE_VALUE)
{
    do
    {                           
        nFilesCount++;
    }
    while (FindNextFile(hFirstFile, &wfd));
}
printf("%d\n", nFilesCount);
В папке 187 файлов
Результат программы 9
Подскажите плз в чём ошибка

Добавлено через 6 минут
Я понял!
Прога считает кол-во папок и файлов в папке, к которой указывает путь, а вложенные на считает!
Баг проги в том, что если файлов и папок 7, то она выведет 9 (как в конкретном случае), если реально 42, прога выведет 44 и т.д.

Добавлено через 1 минуту
Как найти отдельно кол-во файлов и папок?
Как их разделять между собой?

Добавлено через 3 минуты
Одну проблему я нашёл!
Откуда-то берутся то ли файлы то ли папки с именами "." и ".."
Это типо переход на папку вверх и в корень диска?

Добавлено через 3 минуты
Еще одна есть!
Для папок нужно писать
C
1
hFirstFile = FindFirstFile("D:\\Programmes\\EasyCleaner\\*.?", &wfd);
а для файлов
C
1
hFirstFile = FindFirstFile("D:\\Programmes\\EasyCleaner\\*.?*", &wfd);
Зачем нужет ? не знаю, но оно работает так)

Добавлено через 7 минут
прошу прощения за дезинформацию
C
1
hFirstFile = FindFirstFile("D:\\Programmes\\EasyCleaner\\*.?*", &wfd);
это для файлов И папок, а не только для файлов

Добавлено через 8 минут
Вобщем вот код, который считает кол-во папок и файлов в папке по указанному пути. Единственно НО прога не считает вложенные файлы и папки.
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
WIN32_FIND_DATA wfd;
HANDLE hFirstFile_FIles, hFirstFile_Directories;
int nFilesCount = 0, nDirectoriesCount = 0;
hFirstFile_FIles = FindFirstFile("D:\\Programmes\\EasyCleaner\\*.?*", &wfd);
hFirstFile_Directories = FindFirstFile("D:\\Programmes\\EasyCleaner\\*.?", &wfd);
if (hFirstFile_Directories != INVALID_HANDLE_VALUE)
{
    do
    {                           
        nDirectoriesCount++;
    }
    while (FindNextFile(hFirstFile_Directories, &wfd));
}
nDirectoriesCount = nDirectoriesCount - 2;
if (hFirstFile_FIles != INVALID_HANDLE_VALUE)
{
    do
    {                           
        nFilesCount++;
    }
    while (FindNextFile(hFirstFile_FIles, &wfd));
}
nFilesCount = nFilesCount - 2 - nDirectoriesCount;
printf("%d\n", nDirectoriesCount);
printf("%d\n", nFilesCount);
Добавлено через 33 минуты
Если использовать FindFirstFileEx то результат такой-же.

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
WIN32_FIND_DATA wfdEx;
HANDLE hFirstFile_FIlesEx, hFirstFile_DirectoriesEx;
int nFilesCountEx = 0, nDirectoriesCountEx = 0;
hFirstFile_FIlesEx = FindFirstFileEx("D:\\Programmes\\EasyCleaner\\*.?*", FindExInfoStandard, &wfdEx, FindExSearchNameMatch, NULL, 0);
hFirstFile_DirectoriesEx = FindFirstFileEx("D:\\Programmes\\EasyCleaner\\*.?", FindExInfoStandard, &wfdEx, FindExSearchNameMatch, NULL, 0);
if (hFirstFile_DirectoriesEx != INVALID_HANDLE_VALUE)
{
    do
    {                           
        nDirectoriesCountEx++;
    }
    while (FindNextFile(hFirstFile_DirectoriesEx, &wfdEx));
}
nDirectoriesCountEx = nDirectoriesCountEx - 2;
if (hFirstFile_FIlesEx != INVALID_HANDLE_VALUE)
{
    do
    {                           
        nFilesCountEx++;
    }
    while (FindNextFile(hFirstFile_FIlesEx, &wfdEx));
}
nFilesCountEx = nFilesCountEx - 2 - nDirectoriesCountEx;
printf("%d\n", nFilesCountEx);
printf("%d\n", nDirectoriesCountEx);
Добавлено через 2 минуты
Цитата Сообщение от NickoTin Посмотреть сообщение
Перечисление файлов/папок в папке можно осуществить с помощью функции FindFirstFile(Ex)
можно у Вас попросить примерчик для подсчёта количества подпапок и файлов в них.

Добавлено через 17 минут
Кстати я обнаружил, что оба эти кода в некоторых случаях считают папку за файл (!).
Выкладываю код, который нормально работает
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
int main()
{
    setlocale(LC_ALL, "rus");
    Dir("D:\\Programmes\\EasyCleaner\\*.*");
    system("pause");
    return 0;
}
 
void Dir(const char *root)
{
    WIN32_FIND_DATA fd;
    int dir = 0, file = 0;
    HANDLE hFind = FindFirstFile(root, &fd);
    if(hFind != INVALID_HANDLE_VALUE)
    {
        do
        {
            printf("%s: %s\n", (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? "Folder" : "File", fd.cFileName);
            (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? dir++ : file++;
        }
        while(FindNextFile(hFind, &fd));
        printf("%d\n", file);
        printf("%d\n", dir);    
        FindClose(hFind);
    }
}
Добавлено через 4 минуты
Есди может кто-то не знает или забыл, код
C
1
printf("%s: %s\n", (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? "Folder" : "File", fd.cFileName);
расшифровуется как
C
1
2
3
4
5
6
7
8
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
    printf("%s: %s\n", "Folder", fd.cFileName);
}
else
{
    printf("%s: %s\n", "File", fd.cFileName);
}
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
19.03.2014, 11:26  [ТС]
Уважаемые форумчане, если Вы еще не забили на эту тему, то прошу помощи.

Я попытался сделать функцию для подсчёта количества вложенных файлов.

Алгоритм, по которому я пытался написать функцию, которая кстати рекурсивная: в окне файлового менеджера кликаем на необходимую папку и вызывается функция, которая в папке на которую кликнули если находит файл делает +1 к кол-ву файлов, а если папку, то сама себя-же вызывает, а как аргументы передаёт переменную hStaticTmp нужную для передачи предыдущей папке при первом вызове функции, название выбраной папки / найденной функцией, небольшую чекалку которую я добавил для проверки условия чем была вызвана функция кликом мышки или собою же, кол-во файлов, кол-во папок, размер папки, предыдущая папка.
Короче говоря, функция работает не так как хотелось бы. Проблема в переменной показывающей предыдущую папку.

Например:
есть несколько папок в папке
D:\test\1\11
D:\test\1\12

И вот что мы имеем:
Текущая папка D:\test (на неё кликнули мышкой)
Предыдущая папка NULL
-----
Текущая папка D:\test\1 (функция нашла папку и вызвала сама себя перейдя в эту папку)
Предыдущая папка D:\test
-----
Текущая папка D:\test\1\11 (функция нашла папку и вызвала сама себя перейдя в эту папку)
Предыдущая папка D:\test\1
-----
А вот тут проблемка!
Текущая папка D:\test\1\12 (по идее должна быть)
Текущая папка D:\test\1\11\12 (как в программе)
Предыдущая папка D:\test\1\11

Вобщем именно проблема с возвратом в предыдущую папку.
Люди добрые, помогите)

Кидаю код
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
void FileCountDirSize(HWND hStaticTmp, wchar_t szBuf[], int qwe, int dir, int file, int dirsize, wchar_t PrevDir[])
    {
        // szBuf   - название папки, в которой мы находимся
        // PrevDir - путь к папке уровнем выше (должно быть)
 
        wchar_t szTmpF[MAX_PATH] = { 0 };
        wchar_t TmpBuf[MAX_PATH] = { 0 };
        wchar_t SL[] = L"\\";
 
        SendMessage(hListInfo, LB_RESETCONTENT, 0, 0);
        wchar_t buf [MAX_PATH] = { 0 };
        wchar_t ForSearch [MAX_PATH] = { 0 };
        wchar_t ForSearchEnd [] = L"\\*.*";
 
        if (qwe == 0)
        {
            GetWindowText(hStaticTmp, buf, MAX_PATH);
            wcscat(ForSearch, buf);
            wcscat(ForSearch, szBuf);
            wcscat(ForSearch, ForSearchEnd);
            wcscat(buf, szBuf);
            qwe = 1;
        }
        else
        {
            wcscat(ForSearch, PrevDir);
            wcscat(ForSearch, SL);
            wcscat(ForSearch, szBuf);
            wcscat(ForSearch, ForSearchEnd);
            wcscat(PrevDir, SL);
            wcscat(PrevDir, szBuf);
            wcscat(buf, PrevDir);
        }
 
        WIN32_FIND_DATA FindFileData;
        HANDLE hFind;
 
        hFind = FindFirstFileW(ForSearch, &FindFileData);
 
        do
        {
            if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
            if (lstrcmp(FindFileData.cFileName, L".") != 0)
            if (lstrcmp(FindFileData.cFileName, L"..") != 0)
            {
                if (hFind == INVALID_HANDLE_VALUE)
                {
                    //MessageBox(0, L"Ошибка", L"Ненаиден", MB_OK | MB_ICONWARNING);
                }
                else
                {
                    
                    if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                    {
                        dir++;
                        FileCountDirSize(hStaticTmp, FindFileData.cFileName, qwe, dir, file, dirsize, buf);
                    }
                    else
                    {
                        file++;
                        dirsize += FindFileData.nFileSizeLow;
                    }
                }
            }
        }
        while(FindNextFile(hFind, &FindFileData));
 
        wsprintf(szTmpF, L"Кол-во файлов: %d", file);
        MessageBox(0, szTmpF, L"ololo", MB_OK | MB_ICONWARNING);
    }
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
14.04.2014, 10:20  [ТС]
Функцию я написал для подсчёта количества файлов и папок, но с ней возникла небольшая проблема.
Чтоб не писать всё опять просто кину ссылку Поиск папок с помощью FindFirstFile\FindNextFile
Надейсь на Вашу помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2014, 10:20

Файловый менеджер
Здравствуйте, как написать файловый менеджер с такими командами: 1) Список файлов в каталоге (с возможностью сортировки) 2) Переход в...

Файловый менеджер с БД
Здраствуйте! Вопрос к тем, кто смог бы Аргументированно объяснить свою точку зрения по поводу создания файлового менеджера в Delphi с базой...

Файловый менеджер
добрый день, хочу написать фаловый менеджер типа total comander на C#. Помогите с чего начать (какие элементы использовать и тд).

Файловый менеджер на Си
Ребят помогите реализовать вот с такими функциями Набор функций: create, destroy, create_dir, create_file, remove, change_dir,...

Файловый менеджер
Помогите пожалуйста с домашним заданием. Задали сделать файловый менеджер вот картинка, которим он должен быть с виду. Нужно зделать...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru