Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2010, 15:58   #11
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Экзотично конечно, но как-то работает странно . находит подпапки и подпапки в директории, но не удаляет. Находит и пустые и не пустые. Попробую поколдовать над проверкой на наличие файлов.

Вот, пробую так, но, не работает
Код:
function TForm1.finder;
var
 i:integer;
 s:TStringList;
begin
  result:=false;
  ListBox1.Clear; s:=TStringList.Create;
  if SendMessage(ListBox1.Handle,LB_DIR,DDL_DIRECTORY or not DDL_ARCHIVE and not  DDL_DRIVES,
   integer(pchar(path+'*')))<>0 then begin
   result:=true;
   s.Text:=StringReplace(ListBox1.Items.Text,'[','',[rfreplaceall]);
   s.Text:=StringReplace(s.Text,']','',[rfreplaceall]);
   for i:=0 to s.Count-1 do begin
    if s[i]<>'..' then begin
     if not finder(path+s[i]+'\') then
      ListBox2.Items.Add(path+s[i]+'\');

    if s[i] = '' then
    begin
      ListBox2.Items.Delete(i);
    end;

    end;
   end;
  end;
  s.Free;
end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 03.09.2010 в 16:17.
artemavd вне форума Ответить с цитированием
Старый 03.09.2010, 16:18   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но не удаляет
А я там такого и не писал )
Я просто привел пример для разнообразия, может натолкнешся на идею.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.09.2011, 00:09   #13
Mozgoed
Новичок
Джуниор
 
Регистрация: 05.09.2011
Сообщений: 1
По умолчанию Вариант для C#

Код:
using System;
using System.IO;

namespace Mozgoed
{
    public class Program
    {

        public static void Main()
        {
         RemoveEmptyFolders(@"C:\Windows"); //Использование рекурсивной функции
        }

        void RemoveEmptyFolders(string folder) //Сама рекурсивная функция
        {
            string[] items = Directory.GetDirectories(folder);//Узнаём список папок в папке
            if (items.Length > 0) //Если есть папки, то для каждой из них запускаем всё ту же рекурсивную функцию
                foreach (string dir in items)
                    RemoveEmptyFolders(dir);
            items = Directory.GetDirectories(folder);//Снова узнаём список папок в папке
            if (items.Length > 0) return; Если в папке есть хоть одна папка, то мы не имеем права удалять текущую папку. Выходим из этой папки вверх.
            items = Directory.GetFiles(folder); //Иначе: узнаём список файлов в папке
            if (items.Length == 0) //Если в папке нет файлов, значит в ней вообще ничего нет.
                Directory.Delete(folder); //Удаляем текущую папку.
        }
    }
}


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 05.09.2011 в 02:17.
Mozgoed вне форума Ответить с цитированием
Старый 05.09.2011, 02:18   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Mozgoed, а какое отношение Ваш код на C# имеет отношение к разделу, в котором Вы его запостили?!
(напоминаю, что данная тема в разделе "Общие вопросы Delphi")
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.09.2011, 09:49   #15
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Код:
procedure removeFolders(path:string);
function isEmpty(path1 : string):boolean;
var sr1 : TSearchRec;
    emp : boolean;
begin
     emp := true;
     if length(path1)>0 then
     begin
          if FindFirst(path1+'\*',127,sr1)=0 then
          begin
               if sr1.Name[1] <> '.' then
               begin
                    emp := false;
               end;
               while FindNext(sr1)=0 do
               if sr1.Name[1] <> '.' then
               begin
                    emp := false;
                    break;
               end;
          end;
          FindClose(sr1);
     end;
     result := emp;
end;
var sr : TSearchRec;
begin
     if length(path)>0 then
     begin
          if FindFirst(path+'\*',faDirectory,sr)=0 then
          begin
               if (sr.Name[1] <> '.')and(isEmpty(path+'\'+sr.Name)) then
               begin
                    RemoveDirectory(PAnsiChar(path+'\'+sr.Name));
               end;
               while FindNext(sr)=0 do
               if sr.Name[1] <> '.' then
               begin
                    if (sr.Attr = faDirectory)and(isEmpty(path+'\'+sr.Name)) then
                    RemoveDirectory(PAnsiChar(path+'\'+sr.Name));
               end;
          end;
          FindClose(sr);
     end;
end;
попробовал с sr.size=0, но, почему то размер всех папок у меня равен нулю.
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 05.09.2011, 10:14   #16
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ух, разминка какая. Писал в текстовом редакторе, проверять надо. Либо с ручной проверкой так:
Код:
procedure RemoveEmptyDirectories(rootPath: String);
var
	searchRec: TSearchRec;
	searchRecSubDirectory: TSearchRec;
	subDirectoryEmpty: Boolean;
begin
	if FindFirst(rootPath + '*', faDirectory, searchRec) = 0 then
	begin
		repeat
			if (searchRec.attr and faDirectory) = faDirectory then
			begin
				if (searchRec.Name <> '.') and (searchRec.Name <> '..') then
				begin
					subDirectoryEmpty := true;
					if FindFirst(rootPath + searchRec.Name + DirectorySeparator + '*', faAnyFile, searchRecSubDirectory) = 0 then
					begin
						repeat
							if (searchRecSubDirectory.Name <> '.') and (searchRecSubDirectory.Name <> '..') then
							begin
								subDirectoryEmpty := false;
								break;
							end;
						until FindNext(searchRecSubDirectory) <> 0;

						FindClose(searchRecSubDirectory);
					end;

					if subDirectoryEmpty then
					begin
						RemoveDir(rootPath + searchRec.Name);
					end;
				end;
			end;
		until FindNext(searchRec) <> 0;

		FindClose(searchRec);
	end;
end;
или на слово поверив документации, а именно функции RemoveDir сделать так:
Код:
procedure RemoveEmptyDirectories(rootPath: String);
var
	searchRec: TSearchRec;
begin
	if FindFirst(rootPath + '*', faDirectory, searchRec) = 0 then
	begin
		repeat
			if (searchRec.attr and faDirectory) = faDirectory then
			begin
				if (searchRec.Name <> '.') and (searchRec.Name <> '..') then
				begin
					RemoveDir(rootPath + searchRec.Name);
				end;
			end;
		until FindNext(searchRec) <> 0;

		FindClose(searchRec);
	end;
end;
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление пустых строк в таблице Semen90 Microsoft Office Word 24 14.07.2022 12:28
Копирование и удаление пустых строк в отчете Герман13 Microsoft Office Excel 4 03.03.2010 10:28
Заголовок + данные + удаление пустых строк sane4ek_d Microsoft Office Excel 3 22.01.2010 21:37
Поиск значений и удаление пустых строк OgE®_M@G Microsoft Office Excel 12 16.12.2009 20:37
Удаление пустых и повторяющихся строк Marsel737 Общие вопросы Delphi 5 03.12.2009 00:58