Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
 Аватар для Vaiz
104 / 98 / 40
Регистрация: 01.07.2012
Сообщений: 277

Файловый менеджер. Отображение процесса копирования файла

28.04.2014, 00:40. Показов 4579. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне по курсовой работе нужно сделать файловый менеджер средствами WinApi.
Тут мне повезло наткнутся на тему Файловый менеджер , что помогло мне сделать часть программы.

Сейчас думаю над вопросом копирования. Нашел две функции, даже с примерами CopyFileEx и CopyProgressRoutine.
Вопрос: как с помощью этого реализовать копирование с прогресс баром и не использовать mfc?

P.S. Это далеко не последний вопрос, надеюсь найдутся те, кому будет интересно мне помогать

Добавлено через 10 минут
Еще один важный вопрос вспомнил: как определить, является ли файл ярлыком?

Загрузка списка файлов вот:
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
findFile = FindFirstFile(path2, &fileInfo); // Загрузка данных о первом файле
    if (findFile != INVALID_HANDLE_VALUE)
    {
        i = 0;
        do
        {
            //--Вывод имени файла--//
            lvi.iItem = i;                          // номер строки
            lvi.iImage = i;
            lvi.iSubItem = 0;                       // номер колонки
            lvi.pszText = fileInfo.cFileName;       // Текст строки
            lvi.lParam = i;
            ListView_InsertItem(hWndListBox, &lvi);
 
            //--Вывод размера файла--//
            if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                ListView_SetItemText(hWndListBox, i, 1, _T("<Папка>"));
            }
            else
            {
                fileSize.LowPart = fileInfo.nFileSizeLow;
                fileSize.HighPart = fileInfo.nFileSizeHigh;
                _stprintf_s(cTmp, 256, _T("%lld"), fileSize);
                iTmp = _tcslen(cTmp);
                if (iTmp > 3)
                {
                    _tcscpy_s(cTmp2, cTmp);
                    k = 0;
                    for (j = 0; j < iTmp; j++)
                    {
                        if ((iTmp - j) % 3 == 0 && j)
                        {
                            cTmp[k] = ' ';
                            k++;
                        }
                        cTmp[k] = cTmp2[j];
                        k++;
                    }
                    cTmp[k] = 0;
                }
                ListView_SetItemText(hWndListBox, i, 1, cTmp);
            }
            //--Вывод даты файла--//
            FileTimeToSystemTime(&fileInfo.ftLastWriteTime, &fileDate);     // преобразование даты в другую структуру
            _stprintf_s(cTmp, 256, _T("%02d.%02d.%04d %02d:%02d"), fileDate.wDay, fileDate.wMonth, fileDate.wYear, fileDate.wHour, fileDate.wMinute);
            ListView_SetItemText(hWndListBox, i, 2, cTmp);
 
            i++;
        } while (FindNextFile(findFile, &fileInfo));        // Загрузка данных о следующем файле
    }
Добавлено через 2 часа 24 минуты
Попробовал сам сделать окно копирования. Диалог создал в редакторе ресурсов. Не лучший выход на мой взгляд, но хоть как-то. Проблема теперь такая - диалог не отрисовывается, пока копирование файла не закончится.

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
INT_PTR CALLBACK Dialog_Progress_Bar(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    TCHAR lpExistingFileName[MAX_PATH];
    TCHAR lpNewFileName[MAX_PATH];
    switch (message)
    {
    case WM_INITDIALOG:
        switch (lastListBox)
        {
        case 0:
            EndDialog(hDlg, LOWORD(IDCANCEL));
        case 1:
            _tcscpy_s(lpExistingFileName, path1);
            _tcscat_s(lpExistingFileName, selectedFile1);
            _tcscpy_s(lpNewFileName, path2);
            _tcscat_s(lpNewFileName, selectedFile1);
            CopyFileEx(lpExistingFileName, lpNewFileName, CopyProgressRoutine, GetDlgItem(hDlg, IDD_DIALOG_PROGRESS_BAR), 0, COPY_FILE_FAIL_IF_EXISTS);
            break;
        case 2:
            _tcscpy_s(lpExistingFileName, path2);
            _tcscat_s(lpExistingFileName, selectedFile2);
            _tcscpy_s(lpNewFileName, path1);
            CopyFileEx(lpExistingFileName, lpNewFileName, CopyProgressRoutine, GetDlgItem(hDlg, IDD_DIALOG_PROGRESS_BAR), 0, COPY_FILE_FAIL_IF_EXISTS);
            _tcscpy_s(lpNewFileName, selectedFile2);
            break;
        }
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
 
 
DWORD CALLBACK CopyProgressRoutine(
    _In_      LARGE_INTEGER TotalFileSize,
    _In_      LARGE_INTEGER TotalBytesTransferred,
    _In_      LARGE_INTEGER StreamSize,
    _In_      LARGE_INTEGER StreamBytesTransferred,
    _In_      DWORD dwStreamNumber,
    _In_      DWORD dwCallbackReason,
    _In_      HANDLE hSourceFile,
    _In_      HANDLE hDestinationFile,
    _In_opt_  LPVOID lpData
    )
{
    switch (dwCallbackReason)
    {
    case CALLBACK_CHUNK_FINISHED:
        SendMessage((HWND)lpData, PBM_SETPOS, (TotalBytesTransferred.QuadPart / TotalFileSize.QuadPart * 100), 0);
        break;
    }
    return PROGRESS_CONTINUE;
}
Как правильно вызывать функцию CopyFileEx? Возможно стоит это делать в потоке?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.04.2014, 00:40
Ответы с готовыми решениями:

Отображение процесса копирования
Доброго времени суток. у меня есть функция копирования файлов из одной папки в другую: private Boolean SaveFileAs() {...

Отображение процесса копирования в виде индикатора
Всем привет :) У меня была цель написать программу, которая: а) копирует в выходной файл 2 файла: «test1.txt» и...

Приостановление процесса для копирования занятого файла
Приветствую , вопрос таков , как приостановить процесс ? Не убить , именно приостановить . Допустим нужно скопировать файл , который...

20
 Аватар для Vaiz
104 / 98 / 40
Регистрация: 01.07.2012
Сообщений: 277
11.05.2014, 14:27  [ТС]
Студворк — интернет-сервис помощи студентам
Вот что получилось в итоге. Надеюсь больше не придется возится, т.к. лучше тотал коммандера мне явно не написать

Что программа умеет делать:
  • Перемещение по каталогам и дискам
  • Запуск файлов
  • Переименование
  • Копирование
  • Перемещение
  • Создание каталогов
  • Удаление
  • При нажатии ПКМ показывает свойства файла

Чего не хватает:
  • Открытие папок и запуск файлов по нажатию Enter
  • Обновление состояния дисков (они загружаются только при запуске программы)
  • Обработка изменения размеров окна

Может кому-нибудь пригодится
Миниатюры
Файловый менеджер. Отображение процесса копирования файла  
Вложения
Тип файла: 7z Explorer_v2_Lite_2014.05.11.7z (30.7 Кб, 64 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.05.2014, 14:27

Отображение прогресса копирования файла
Нужно отобразить прогресс копирования файла из одной папки в другую. При использовании потоков ввода вывода это не составляет труда, т.к....

Процентное отображение статуса копирования файла в Label`ле
Здравствуйте друзья Отображаю процесс копирования данных в progressBar1, хочу поставить Label и в нем отображать процент загрузки тоже....

Отображение процесса скачивания файла
Всем привет) Вообщем у меня возникла проблемка, так вот, как по завершению скачивания файла высветить сообщение, Например: &quot;Файл...

Отображение процесса скачки файла в ProgressBar
Качаю файл с FTP таким кодом procedure TForm1.sButton1Click(Sender: TObject); var I: Integer; begin if not scheckbox1.Checked...

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


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации 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