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

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

17.02.2014, 21:59. Показов 5072. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации 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 — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru