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

Удаление папок

09.06.2020, 14:22. Показов 2010. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Имеется общая папка, в которой содержатся папки с файлами. Требуется оставить все папки, введенные в Memo, а остальные удалить. Вот, что я сделал:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button5Click(Sender: TObject);
var
s, DirectoryName: String;
i: Integer;
 
begin
Memo2.Clear;
for i := 0 to Memo1.Lines.Count - 1 do
  begin
  for s in TDirectory.GetDirectories(Edit1.Text) do
    begin
    DirectoryName:=TPath.GetFileName(s);
      try
      if Memo1.Lines.IndexOf(DirectoryName) < 0 then TDirectory.Delete(Edit1.Text + DirectoryName, true);
      except
      Memo2.Lines.Add('Папка не найдена: ' + Memo1.Lines.Strings[i]);
      end;
    end;
  end;
В Edit1 содержится путь к общей папке, в Memo1 соответственно вводится список папок, которые нужно оставить. Проблема заключается в том, что если в Memo введена папка, которой нет в общей папке, то удаляются все папки. except также ничего не выводит.

Например:
В общей папке содержатся: папка 1, папка 2
1. Вводится в Memo (в столбик): 1, 2, 3; результат - ничего не удаляется (как и должно быть).
2. Вводится в Memo (в столбик): 1, 3; результат - удалена папка 2 (как и должно быть).
3. Вводится в Memo: 3; результат - удалены папки 1 и 2 (папки 3 в общей папки нет, соответственно удаляться ничего не должно).

Перепробовал различные варианты - так ничего и не получилось.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.06.2020, 14:22
Ответы с готовыми решениями:

Удаление папок
Здравствуйте. Как можно вызвать, что бы в определённой папке, удалились все папки с в их вложенными файлами, при этом, запретить удаление...

Удаление папок
У меня есть 2 папки Logs и Cache и вних пишутся логи и кеш. как при нажатие на кнопку удалить папки и то что вних?

Удаление и копирование папок
Доброго времени суток. Подскажите, как в Delphi7 (или просто в паскале) удалить из определенного каталога папку &quot;userdata&quot; вместе...

30
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
14.06.2020, 11:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от D1973 Посмотреть сообщение
почему не выводить на обозрение реально существующие подкаталоги и выбрать те, которые надо оставить?
+++
Я бы сделал это через комбобокс хотя бы... Ну, или через другой компонент - ShellTreeView, ListBox.
Выводил бы список имеющихся папок, чтобы пользователь только выбирал их из списка.
А иначе реально программа в лотерею превращается "Угадай, что на моём диске Х?"
0
0 / 0 / 0
Регистрация: 10.03.2020
Сообщений: 20
14.06.2020, 11:21  [ТС]
В общем, я всё понял. Всем огромное спасибо за обсуждение, а также D1973 и Алексеич за свои варианты кода. Продолжать обсуждать данную тему я считаю нецелесообразным.
0
17 / 14 / 3
Регистрация: 21.03.2017
Сообщений: 155
15.06.2020, 11:25
Цитата Сообщение от user2020-03 Посмотреть сообщение
Алексеич, Ваш код точно также удаляет все папки, если введена несуществующая папка
Попробовал - удаляет не все, а только те, которых нет в списке в мемо, как ты и хотел. Специально ввёл в мемо одну существующую и одну несуществующую. В итоге в исходной папке осталась только та из мемо.
Может ты хочешь, чтобы если в мемо есть хотя бы одна несуществующая папка, то удаляться вообще ничего не должно, а нужно вывести сообщение об ошибке? Ну так это отдельная задача - сначала перебери все папки из мемо, проверь каждую на существование, ничего не удаляя.
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
15.06.2020, 11:27
Цитата Сообщение от user2020-03 Посмотреть сообщение
В общем, я всё понял.
да ничего ты не понял!

Цитата Сообщение от user2020-03 Посмотреть сообщение
Продолжать обсуждать данную тему я считаю нецелесообразным.
Написать код, который ты хочешь получить, никаких проблем нет (если хочешь, напишу я тебе его).
Тебе пытаются объяснить, что ты придумал плохой UI и даже рассказывают, почему это интерфейс плохой.
Но если тебе это реально надо, то можешь делать и так.

вот только расскажи.
вариант 1
есть папка. в ней есть папки 1 2 3
Пользователь в мемо указал
2, 2, 4, 5
Нажал кнопку Button5 "Удалить лишнее"

вариант 2
есть папка. в ней есть папки 1 2 3
Пользователь в мемо указал
2, 2, 3, 5, 1
Нажал кнопку Button5 "Удалить лишнее"


вопрос - должно ли что-то удалиться из заданной папки?
Что и куда должна вывести программа (сообщение об ошибке, например, или информацию о том, что было удалено)?
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
15.06.2020, 11:39
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
вот только расскажи.
да не хочет он говорить... Есть такие люди (сагу о XYZ помнишь?), которые ждут от понимающих, что они помогут им родить монстра..
..при встрече с которым потом даже самым смелым Понимающим целый месяц снятся кошмары. Тёмные Силы празднуют победу в этот день. Душа Новичка обречена гореть в геенне огненной за грехи свои.
1
0 / 0 / 0
Регистрация: 10.03.2020
Сообщений: 20
17.06.2020, 00:41  [ТС]
Цитата Сообщение от Алексеич Посмотреть сообщение
Попробовал - удаляет не все, а только те, которых нет в списке в мемо, как ты и хотел
Так-то мой код точно также корректно оставляет нужные папки. Проблема заключается в совершенно в другом. Об этом я писал в первом сообщении и более детально объяснял в 13-м.

Цитата Сообщение от mr-Crocodile Посмотреть сообщение
Тебе пытаются объяснить, что ты придумал плохой UI и даже рассказывают, почему это интерфейс плохой
Я делаю программу исключительно для себя и я пользователь своей программы. В данном случае что мне нужно:
1. Ввести в Memo1 список папок, которые нужно оставить.
2. Если в Memo1 не найдено такой папки, то вывести в Memo2 следующее: "Папка не найдена: название папки".
Вот и все дела! Каждый делает так, как считает нужным.

Цитата Сообщение от mr-Crocodile Посмотреть сообщение
вариант 1
есть папка. в ней есть папки 1 2 3
Пользователь в мемо указал
2, 2, 4, 5
Нажал кнопку Button5 "Удалить лишнее"
1 и 3 должны удалиться.

Цитата Сообщение от mr-Crocodile Посмотреть сообщение
вариант 2
есть папка. в ней есть папки 1 2 3
Пользователь в мемо указал
2, 2, 3, 5, 1
Нажал кнопку Button5 "Удалить лишнее"
Тут ничего не должно удалиться.

Цитата Сообщение от mr-Crocodile Посмотреть сообщение
Что и куда должна вывести программа (сообщение об ошибке
В первом сообщении в блоке except я указал, что в случае, если папка не найдена, должна выводится ошибка в Memo2. В 13-м сообщении я более детально объяснял.
Delphi
1
2
3
except
Memo2.Lines.Add('Папка не найдена: ' + Memo1.Lines.Strings[i]);
end;
Добавлено через 5 минут
Сообщение 19, моя цитата:
"В любом случае, если введена несуществующая папка, должна выводиться ошибка"
0
17.06.2020, 08:59

Не по теме:


таким макаром если ввести "C:\MyApp", то можно потереть все остальные папки на диске С, какие ОС разрешит...

1
17 / 14 / 3
Регистрация: 21.03.2017
Сообщений: 155
17.06.2020, 09:08
user2020-03, в своём коде вместо 10 - 18 строк пробуй:
Delphi
1
2
if not TDirectory.Exists(Edit1.Text + PathDelim + Memo1.Lines.Strings[i]) then
  Memo2.Lines.Add('Папка не найдена: ' + Memo1.Lines.Strings[i])
А удаление тебе уже писали как делать.
1
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
17.06.2020, 09:50
user2020-03, в принципе понятно. Если маленькие нестыковки.

Цитата Сообщение от user2020-03 Посмотреть сообщение
Я делаю программу исключительно для себя и я пользователь своей программы. В данном случае что мне нужно:
1. Ввести в Memo1 список папок, которые нужно оставить.
2. Если в Memo1 не найдено такой папки, то вывести в Memo2 следующее: "Папка не найдена: название папки".
в Memo1 не найдено? Это, скорее всего опечатка. Ты имел в виду - среди папок на диске нет такой папки, которая указана в Memo1, тогда эту "лишнюю"папку нужно прописать в Memo2.
Ладно. Хорошо. Понятно.

теперь берём два примера.
Цитата Сообщение от user2020-03 Посмотреть сообщение
Цитата Сообщение от mr-Crocodile
вариант 1
есть папка. в ней есть папки 1 2 3
Пользователь в мемо указал
2, 2, 4, 5
Нажал кнопку Button5 "Удалить лишнее"
1 и 3 должны удалиться.
и сообщений не надо никаких про папки 4 и 5, которые указаны в Memo1, а такие папки отсутствуют?
и папки 1 и 3 спокойно удаляем.
Тут ты про сообщения в Memo2 просто не написал, так?

Главное, наличие в Memo1 "лишних" папок НИКАК не влияет на то, будет программа удалять папки или нет, верно я тебя понял?


Тогда попробуй код Алексеич из пост #28, он как раз и выведет в Memo2 список всех папок из Memo1, которых нет на диске.
А как удалить те папки, которых нет в Memo1, тебе уже показали.

Добавлено через 6 минут
я тут ещё подумал...

Но тогда это не соответствует варианту 5
Цитата Сообщение от user2020-03 Посмотреть сообщение
Вариант №5: ввожу в Memo 3 - удаляются папки 1 и 2, хотя папки 3 не существует в общей папке. В данном случае должна выводится ошибка, что "Папка не найдена: 3" и на этом программа заканчивает работу. А на самом деле получается, что папка 3 якобы существует и соответственно удаляются папки 1 и 2. except почему-то не срабатывает и программа продолжает работу.
то есть тебе нужно, проверить и если в memo1 нет ни одной папки, которую нужно оставить (указаны ТОЛЬКО НЕСУЩЕСТВУЮЩИЕ ПАПКИ), тогда ВООБЩЕ ничего удалять НЕ НАДО, а нужно выдать сообщение об ошибке в Memo2?
Такую логику ты хочешь получить?
0
0 / 0 / 0
Регистрация: 10.03.2020
Сообщений: 20
17.06.2020, 13:05  [ТС]
Цитата Сообщение от Matan! Посмотреть сообщение
таким макаром если ввести "C:\MyApp", то можно потереть все остальные папки на диске С, какие ОС разрешит...
Я выбираю конкретно общую папку, где требуется оставить нужные папки. Подобные эксперименты я не собираюсь делать.

Алексеич, делал я точно также, но всё равно, если в Memo1 введена только ОДНА несуществующая папка удаляются все папки. Ошибка при этом выводится как и положено.

Цитата Сообщение от mr-Crocodile Посмотреть сообщение
Ты имел в виду - среди папок на диске нет такой папки, которая указана в Memo1, тогда эту "лишнюю"папку нужно прописать в Memo2.
Да, это я и имел в виду, просто неправильно выразился.

Цитата Сообщение от mr-Crocodile Посмотреть сообщение
и сообщений не надо никаких про папки 4 и 5, которые указаны в Memo1, а такие папки отсутствуют?
и папки 1 и 3 спокойно удаляем.
1 и 3 удаляются, 2 остаётся, 4 и 5 нет в общей папке, поэтому в Memo2 должна выводится ошибка: "Папка не найдена: название папки".

Цитата Сообщение от mr-Crocodile Посмотреть сообщение
Тут ты про сообщения в Memo2 просто не написал, так?
Я писал выше "В любом случае, если введена несуществующая папка, должна выводиться ошибка".

Цитата Сообщение от mr-Crocodile Посмотреть сообщение
то есть тебе нужно, проверить и если в memo1 нет ни одной папки, которую нужно оставить (указаны ТОЛЬКО НЕСУЩЕСТВУЮЩИЕ ПАПКИ), тогда ВООБЩЕ ничего удалять НЕ НАДО, а нужно выдать сообщение об ошибке в Memo2?
Такую логику ты хочешь получить?
Да, если в Memo1 введена ТОЛЬКО ОДНА (или несколько) несуществующая папка, то НЕ ДОЛЖНЫ удаляться все остальные папки. Должна выводится ошибка и на этом всё. В этом и была суть обращения на форум.
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
17.06.2020, 13:51
Лучший ответ Сообщение было отмечено user2020-03 как решение

Решение

Цитата Сообщение от user2020-03 Посмотреть сообщение
Да, если в Memo1 введена ТОЛЬКО ОДНА (или несколько) несуществующая папка, то НЕ ДОЛЖНЫ удаляться все остальные папки. Должна выводится ошибка и на этом всё.
проверь, так ты хотел?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm1.Button5Click(Sender: TObject);
var A: TStringDynArray;
    i: integer;
    isExistDirectoryInMemo1 : boolean;
begin
 
  isExistDirectoryInMemo1 := false;
  Memo2.Clear;
  for i := 0 to Memo1.Lines.Count - 1 do
     if TDirectory.Exists(Edit1.Text + PathDelim + Memo1.Lines.Strings[i]) 
       then isExistDirectoryInMemo1 := true 
            // вот ключевой момент. если хоть одна папка из Memo1 нашлась, то флаг := true
 
       else Memo2.Lines.Append('Папка не найдена: ' + Memo1.Lines.Strings[i]);
 
 
  if Not isExistDirectoryInMemo1 then 
    Memo2.Lines.Append('в Memo1 не указана ни одна из существующих папок. Это ошибка! Выход из процедуры по ошибке!');
  else begin  
    A := TDirectory.GetDirectories(Edit1.Text);
    for i := Low(A) to High(A) do
       if Memo1.Lines.IndexOf(TPath.GetFileName(A[i])) = -1 then TDirectory.Delete(A[i], true);
  end;
end;
p.s. будь осторожен с разными регистрами. я не уверен, что поиск IndexOf в мемо в твоей Delphi регистронезависим (case insensitive) - иначе имя папки не в том регистре и баста - она не найдена в исключениях и поэтому удалена.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2020, 13:51
Помогаю со студенческими работами здесь

Удаление всех папок
Как удалить все папки которые начинаются с цифр из определенной папки? Добавлено через 10 минут PS. И что бы если там есть файлы...

В папке нахотится неизвестное количество папок, а в каждой из папок по одному текстовому файлу...
Ребята помогите пожалуйста! У меня такая задача: в папке нахотится неизвестное количество папок, а в каждой из папок по одному текстоваму...

удаление папок и файлов без winAPI
Кто подскажет как не используя win API при помощи DELFI 6.0 удалить папку вместе с файлами и другими папками (можете назвать их каталоги,...

Удаление папок
#include &lt;vcl.h&gt; #include &quot;dstring.h&quot; #pragma hdrstop #include &quot;Unit1.h&quot; ...

Удаление папок
нужен скрипт чтобы удалить все папки с именами, начинающимися с temp, вместе с содержимым (сделать префикс параметром) помогите...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru