Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Эксперт 1С
 Аватар для OverDozero
924 / 329 / 130
Регистрация: 07.04.2011
Сообщений: 1,749

Удаление каталога с файлами. Обработка исключений

14.04.2015, 21:16. Показов 1328. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
DWORD DirExist = GetFileAttributes(PathCreateDir);
    if (DirExist == 0xFFFFFFFF)/*не найдена*/
        {
        RETRYCREATEDIR:
            try                                 
                {CreateDir = CreateDirectory(PathCreateDir, NULL);}
                                                                    
            catch (...) 
                {
                    if (CreateDir == 0 ) 
                        {
                            int Result = MessageBox(hDlg, L"Не удалось создать каталог.Возможно нет прав доступа к каталогу.Нажмите ПОВТОР для попытки создания каталога или ОТМЕНА для прекращения выполнения программы", L"Ошибка создания", MB_ICONERROR|MB_RETRYCANCEL);
                        if (Result == IDCANCEL) {return 0;}
                        if (Result == IDRETRY) {goto RETRYCREATEDIR;}
                                                    }
                        }
                }                           
    else /*найдена*/
        {
            TCHAR DelFilesDirectory[MAX_PATH] = {0};
            _tcscpy(DelFilesDirectory,PathCreateDir);
            RETRYREMOVEDIR:
                try
                    {
                        SHFILEOPSTRUCT sh;
                        sh.hwnd = hDlg;
                        sh.wFunc = FO_DELETE;
                        sh.pFrom =DelFilesDirectory;
                        sh.pTo = NULL;
                        sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT ;
                        sh.hNameMappings = 0;
                        sh.lpszProgressTitle = NULL;
                        SHFileOperation (&sh);
 
                    }
                            catch (...)
                                {
                                int Result = MessageBox(hDlg, L"Не удалось удалить каталог.Возможно нет прав доступа к каталогу или он в данный момент используется.Нажмите ПОВТОР для попытки удаления каталога или ОТМЕНА для прекращения выполнения программы", L"Ошибка удаления", MB_ICONERROR|MB_RETRYCANCEL);
                                if (Result == IDCANCEL) {return 0;}
                                if (Result == IDRETRY) {goto RETRYREMOVEDIR;}
                                                    }
                            }
Вроде удаляет корректно.Всю папку с вложенными файлами.
1 вопрос:В чем тут у меня есть ошибки?Что неправильно реализовано?Что можно улучшить?
2 вопрос:Не срабатывает try - catch.
Например если открыт файл в удаляемой папке,то должно сработать исключение именно из моего приложения.В данном случае открыт документ экселя,и при попытке удаления вылазит окно windows что файл используется таким-то приложением.То есть если директория не удаляется(открыты файлы) то должен постоянно выходить мессажбокс с кнопками повтора и отмены.
P.S.Знаю что goto не очень хорошо ))).Не придумал чем заменить еще)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.04.2015, 21:16
Ответы с готовыми решениями:

Обработка исключений try - catch при сканировании каталога
Напишите программу, которая сканирует некоторую папку (задаётся пользователем) с учётом поддиректорий, все хранящиеся в ней файлы...

Работа с файлами. Обработка исключений
Будьте добры, помогите с решением задач. Заранее благодарю откликнувшихся! :) 1. Создать класс для работы с файлами. В классе...

Обработка исключений при работе с файлами
Кто может помочь с обработкой исключений для файла? Нужно чтобы обработчик перехватывал исключение и предлагал ввести путь к файлу заново....

2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.04.2015, 22:31
Цитата Сообщение от OverDozero Посмотреть сообщение
1 вопрос:В чем тут у меня есть ошибки?Что неправильно реализовано?Что можно улучшить?
Убрать try/catch. Он здесь лишний.

Цитата Сообщение от OverDozero Посмотреть сообщение
2 вопрос:Не срабатывает try - catch.
И не должен. WinAPI - это голый C-шный интерфейс, без плюсовых исключений, с
ручной работой с памятью и т.д. В документации на каждую функцию сказано,
какие коды она возвращает в случае успеха и в случае ошибки, вот их и
следует проверять.
2
Эксперт 1С
 Аватар для OverDozero
924 / 329 / 130
Регистрация: 07.04.2011
Сообщений: 1,749
15.04.2015, 20:09  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
TCHAR DelFilesDirectory[MAX_PATH] = {0};
    _tcscpy(DelFilesDirectory,PathCreateDir);
        RETRYREMOVEDIR:
                SHFILEOPSTRUCT sh;
                sh.hwnd = hDlg;
                sh.wFunc = FO_DELETE;
                sh.pFrom =DelFilesDirectory;
                sh.pTo = NULL;
                sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_ALLOWUNDO ;
                sh.fAnyOperationsAborted;
                sh.hNameMappings = 0;
                sh.lpszProgressTitle = NULL;
                SHFileOperation (&sh);
                if (sh.fAnyOperationsAborted == TRUE)
                    {
                    int Result = MessageBox(hDlg, L"Не удалось удалить каталог.Возможно нет прав доступа к каталогу или он в данный момент используется.Нажмите ПОВТОР для попытки удаления каталога или ОТМЕНА для прекращения выполнения программы", L"Ошибка удаления", MB_ICONERROR|MB_RETRYCANCEL);
                    if (Result == IDCANCEL) {return 0;}
                    if (Result == IDRETRY) {goto RETRYREMOVEDIR;}
                    }                                                   
    }
Вот так что-то похожее на то,что мне необходимо.Но только на строке SHFileOperation (&sh);,если файл занят - то выходит стандартное окошко windows о том,что каталог используется.И потом уже выходит мое сообщение с попыткой повтора.
Если написать так:sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_ALLOWUNDO |FOF_NOERRORUI ; с флагом FOF_NOERRORUI ,то стандартное виндовое окошко уже не вываливается,но вместе с тем не срабатывает и моя обработка ошибки удаления.
Что-то никак не пойму как это реализовать.Посмотрел возвращаемые коды ошибок из SHFileOperation,нет подходящей - файл или каталог занят.
Прошу помощи!Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.04.2015, 20:09
Помогаю со студенческими работами здесь

Удаление каталога с файлами
У кого нить есть нормальный код удаление папки с файлами?

Обработка исключений. Как организовать общий обработчик исключений?
У меня есть последовательность вызова методов для внесения данных в таблицу БД. Сам метод внесения данных. Он генерирует исключение ...

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

Операции создания каталога, изменения временного каталога, удаление файла и директории
Написать программу, которая позволяет выполнять операции создания каталога, изменения временного каталога, удаление файла и директории...

Выполнение операций создания каталога, изменения временного каталога, удаление файла и директории (рекурсивно)
пожалуйста напишите программу, которая позволяет выполнять операции создания каталога, изменения временного каталога, удаление файла и...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru