Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Удаление папок с сервера средствами Delphi


Автор: GrafCharodey 14.12.2006, 16:03
Здравствуйте!

Хочу попросить о помощи. Я пишу программу для очистки фаилообменника на сервере. Программе даётся путь корня фаилообменика, она получает список папок первого уровня в нём, затем удаляет папки и всё их содержимое. После чего пользуясь списком создает папки заново уже пустыми. В принципе реализовать оказалось довольно легко, очищает прототип фаилообменика находящемся на моём диске, но когда решил протестировать на сервере, то он не смог удалить большинство папок. Если есть мысли на этот счёт, буду очень рад услышать. Приведу код функции удаления папок и их содержимого
Код

function MyRemoveDir(sDir: string): Boolean;
var
  iIndex: Integer;
  SearchRec: TSearchRec;
  sFileName: string;
begin
  Result := False;
  sDir := sDir + '\*.*';
  iIndex := FindFirst(sDir, faAnyFile, SearchRec);

  while iIndex = 0 do
  begin
    sFileName := ExtractFileDir(sDir)+'\'+SearchRec.name;
    if (SearchRec.Attr and faDirectory) = faDirectory then
    begin
      if (SearchRec.name <> '' ) and
         (SearchRec.name <> '.') and
         (SearchRec.name <> '..') then
        MyRemoveDir(sFileName);
    end
    else
    begin
      if SearchRec.Attr <> faArchive then
        FileSetAttr(sFileName, faArchive);
      DeleteFile(sFileName);
    end;
    iIndex := FindNext(SearchRec);
  end;
:

Заранее благодарен...

Автор: Matematik 14.12.2006, 16:19
Замечания по коду.
1. SearchRec.name<>''  - это зачем?
2. Проверять надо, что возвращает DeleteFile()
И вообще я не вижу чтобы удалялись папки.

Автор: Romikgy 14.12.2006, 16:20
сними атрибуты скрытый и системный , и будут имхо все файлы удалятся

Автор: GrafCharodey 14.12.2006, 16:30
Matematik, 
Цитата

1. SearchRec.name<>''  - это зачем?


Обеспечение поиска файлов в папке...

Цитата

Проверять надо, что возвращает DeleteFile()


Проверяю, возращает false, не может удалить...

Цитата

И вообще я не вижу чтобы удалялись папки. 



Поверь мне, они удаляются)) (по крайней мере с моего харда)



Romikgy, 

Цитата

сними атрибуты скрытый и системный , и будут имхо все файлы удалятся 


Да вроде бы не работает, всё убрано и общий доступ открыт...

Автор: Matematik 14.12.2006, 16:43
GrafCharodey
Имя файла\директории не может ровнятся пустой строке.
В написанном коде проверок нет и папки не удаляются. Пиши весь код.
И атрибуты не надо снимать. Все нормально удаляется с ними, проверено на горьком опыте - удалил все файлы корня диска "c:"

Автор: GrafCharodey 14.12.2006, 16:50
Matematik, пишу весь код...

Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  FileCtrl,
  Classes;

procedure GetTreeDirs(Root: string; OutPaper: TStringList);
var
  i: Integer;
  s: string;

  procedure InsDirs(s: string; ind: Integer; Path: string; OPaper: TStringList);
  var
    sr: TSearchRec;
    attr: Integer;
  begin
    attr := 0;
    attr := faAnyFile;
    if DirectoryExists(Path) then
      if FindFirst(IncludeTrailingBackslash(Path) + '*.*', attr, SR) = 0 then
      begin
        repeat
          if ((sr.Attr and faDirectory) = faDirectory) and (sr.Name[Length(sr.Name)] <> '.') then
            OPaper.Insert(ind, s + sr.Name);
        until (FindNext(sr) <> 0);
        FindClose(SR);
      end
  end;

begin
  {Проверяем существуетли начальный каталог}
  if not DirectoryExists(Root) then
    exit;
  {Создаем список каталогов первой вложенности}
  if root[Length(Root)] <> '\' then
    InsDirs(root + '\', OutPaper.Count, Root, OutPaper)
  else
    InsDirs(root, OutPaper.Count, Root, OutPaper);
  i := 0;
end;

function MyRemoveDir(sDir: string): Boolean;
var
  iIndex: Integer;
  SearchRec: TSearchRec;
  sFileName: string;
begin
  Result := False;
  sDir := sDir + '\*.*';
  iIndex := FindFirst(sDir, faAnyFile, SearchRec);

  while iIndex = 0 do
  begin
    sFileName := ExtractFileDir(sDir)+'\'+SearchRec.name;
    if (SearchRec.Attr and faDirectory) = faDirectory then
    begin
      if (SearchRec.name <> '' ) and
         (SearchRec.name <> '.') and
         (SearchRec.name <> '..') then
        MyRemoveDir(sFileName);
    end
    else
    begin
      if SearchRec.Attr <> faArchive then
        FileSetAttr(sFileName, faArchive);
      DeleteFile(sFileName);
    end;
    iIndex := FindNext(SearchRec);
  end;

  FindClose(SearchRec);

  if RemoveDir(ExtractFileDir(sDir)) then
  Result := True;
end;


var
  Strs: TStringList;
  i: integer;
  S: Tstrings;

begin
  { TODO -oUser -cConsole Main : Insert code here }

  Strs := TStringList.Create;
  try
    GetTreeDirs('I:\!TEST', Strs);
    for i := 0 to Strs.Count - 1 do
    begin
      MyRemoveDir(Strs.Strings[i]);
      CreateDir(Strs.Strings[i]);
    end;
  finally
    Strs.Free;
  end;
end.
 

Автор: GrafCharodey 15.12.2006, 09:07
Matematik, скорее всего ты прав... Мне сделали тест на котором программа запарывается... Причём на обычных папках, используя систему многоуровневой вложености пустых папок... Если есть идеи по улучшению алгоритма, буду очень благодарен...

Автор: GrafCharodey 15.12.2006, 11:08
Всем спасибо!!!
Проблему решил сам, использовал удаление директорий посредством API.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)