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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2010, 11:09   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Удаление пустых папок в подпапке

Как удалить пустые папки (именно папки) в указанной папку, если путь до корнейвой папки я сам укажу? Нужно, чтобы удалились только пустые подпапки в указанной папке. Пните в ту сторону, где можно почитать конкретную литературу по этому вопросу
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.09.2010, 11:11   #2
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

ну, насколько я помню, RemoveDir удаляет только пустую папку
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 03.09.2010, 11:22   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

FindFirst с аттрибутом faDirectory. Потом проводим поиск рекурсивно в найденной папке и если пуста - киляем её.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 03.09.2010, 11:26   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

а пройтись рекурсией по папкам и проверить из размер?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.09.2010, 13:11   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вот, пытаюсь сделать поиск. Но, не работает. Выдает ошибку, которая записана в ShowMessage и зависает, когда я указываю через SelectDirectory папку в которой надо искать пустые подпапки. Нужно, чтобы имена всех пустых папок вывелись в ListBox, а затем удалились.
Вложения
Тип файла: zip REF.zip (9.3 Кб, 20 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.09.2010, 13:19   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вот. когда-то для себя делал.
Консольное приложение.
В нужном расскомментарить.

Код:
program EmptyDirList;
{$APPTYPE CONSOLE}

uses SysUtils, Windows;

var
  IOCode        : integer;
  cDir0         : string;

function StrAnsiToOem(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  AnsiToOemBuff(@S[1], @Result[1], Length(S));
end;

function FilesCountInScanDirectory( cDirName : string) : integer;
var
  lCountResult    : integer;
  SearchRec       : TSearchRec;
  isFound         : integer;
begin
  lCountResult := 0;
  isFound := FindFirst( cDirName+'\*.*', faAnyFile, SearchRec);
  while ( isFound = 0 ) do begin
     if (SearchRec.Attr and faDirectory)<>0 then begin
         if (Trim(SearchRec.Name)<>'.') and
              (Trim(SearchRec.Name)<>'..') then begin
           lCountResult := FilesCountInScanDirectory(
                             cDirName+'\'+SearchRec.Name) + lCountResult;
         end
       end
     else
       lCountResult := lCountResult + 1;
     isFound := FindNext(SearchRec)
  end;
  SysUtils.FindClose(SearchRec);
  Result := lCountResult;
  if lCountResult = 0 then begin
     WriteLn( 'NOW you can delete FOLDER - '+ strAnsiToOem(cDirName));
     {$I-}
     // убрать комментарий строки ниже, чтобы пустые папки УДАЛЯЛИСЬ!!!!!!
     //     RmDir(cDirName);  // ВНИМАНИЕ!! ПАПКИ УДАЛЯЮТСЯ данной командой!
     IOCode := IOResult;
     if IOCode <> 0 then
       WriteLn('Cannot remove directory ',strAnsiToOem(cDirName),' Error code:',IOCode)
     else
       WriteLn('Directory ', strAnsiToOem(cDirName), ' removed ');
     {$I+}
  end
end;

begin
  // директория, с которой нужно начинать просмотр дерева каталогов
  // можно брать, например, из командной строки cDir0 := ParamStr(1);
  cDir0 := 'C:\TESTIN2';
  // рекурсивно обойти дерово начиная с папки CDir0
  FilesCountInScanDirectory( cDir0 );
  WriteLn('Done.');
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.09.2010, 13:34   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Правильно ли я понял, что данный код переводится на Delphi так:
Код:
var
  IOCode        : integer;
  cDir0         : string;

function StrAnsiToOem(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  AnsiToOemBuff(@S[1], @Result[1], Length(S));
end;

function FilesCountInScanDirectory( cDirName : string) : integer;
var
  lCountResult    : integer;
  SearchRec       : TSearchRec;
  isFound         : integer;
begin
  lCountResult := 0;
  isFound := FindFirst( cDirName+'\*.*', faAnyFile, SearchRec);
  while ( isFound = 0 ) do begin
     if (SearchRec.Attr and faDirectory)<>0 then begin
         if (Trim(SearchRec.Name)<>'.') and
              (Trim(SearchRec.Name)<>'..') then begin
           lCountResult := FilesCountInScanDirectory(
                             cDirName+'\'+SearchRec.Name) + lCountResult;
         end
       end
     else
       lCountResult := lCountResult + 1;
     isFound := FindNext(SearchRec)
  end;
  SysUtils.FindClose(SearchRec);
  Result := lCountResult;
  if lCountResult = 0 then begin
     WriteLn( 'NOW you can delete FOLDER - '+ strAnsiToOem(cDirName));
     {$I-}
     // убрать комментарий строки ниже, чтобы пустые папки УДАЛЯЛИСЬ!!!!!!
          RmDir(cDirName);  // ВНИМАНИЕ!! ПАПКИ УДАЛЯЮТСЯ данной командой!
     IOCode := IOResult;
     if IOCode <> 0 then
       ShowMessage('Cannot remove directory ',strAnsiToOem(cDirName),' Error code:',IOCode)
     else
       ShowMessage('Directory ', strAnsiToOem(cDirName), ' removed ');
     {$I+}
  end
end;

begin
  // директория, с которой нужно начинать просмотр дерева каталогов
  // можно брать, например, из командной строки cDir0 := ParamStr(1);
  cDir0 := 'C:\TESTIN2';
  // рекурсивно обойти дерово начиная с папки CDir0
  FilesCountInScanDirectory( cDir0 );
  ShowMessage('Done');
end.
???
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.09.2010, 13:40   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

artemavd, он и был на Делфи
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.09.2010, 13:42   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Переработал я видать уже . Не обращайте внимания. С 8 утра на работе до сих пор щас.

ругается на эту строчку
Цитата:
ShoeMessage( 'NOW you can delete FOLDER - '+ strAnsiToOem(cDirName));
пишет:
[Error] Unit1.pas(58): Undeclared identifier: 'strAnsiToOem'
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

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

А как вам, господа, такой приемчик?:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    procedure FormCreate(Sender: TObject);
  private      e:string;
    { Private declarations }
    function finder(path:string):boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
          {$o-}
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]+'\');
    end;
   end;
  end;
  s.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

 finder('d:\1\');
end;

end.
Экзотично, зато работает )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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