Удаление файлов по маске

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Удаление файлов по маске

Сообщение dunin »

Вопрос: есть какая-нибудь навороченная функция, чтобы можно было грохнуть все файлы по маске? Или только через поиск по TSearchRec?
Спасибо.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Так есть же системные комманды del и rm. [url]http://ru.wikipedia.org/wiki/Патч_Бармина[/url]
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Сквозняк писал(а):Так есть же системные комманды del и rm. [url]http://ru.wikipedia.org/wiki/Патч_Бармина[/url]

Дык так рассуждать, можно половину юнита FileUtil выкинуть... Не годится - не кроссплатформенно.

Добавлено спустя 51 минуту 11 секунд:
Держите, может кому пригодится.

Код: Выделить всё

function DeleteFileByMask (Dir, Ext: string): boolean;
  const
      {$IFDEF WINDOWS}
        DirSeparator = '\';
      {$ENDIF}
      {$IFDEF LINUX}
        DirSeparator = '/';
      {$ENDIF}
    var SearchRec: TSearchRec;
begin
  Result:= False;
  if DirectoryExists(Dir)
    then begin
      if FindFirst(Dir+DirSeparator+Ext,faAnyFile,SearchRec) = 0 then begin
          repeat
            if FileExists(Dir+DirSeparator+(SearchRec.Name)) then begin
              DeleteFile(Dir+DirSeparator+(SearchRec.Name))
            end
          until FindNext(SearchRec) <> 0;
          FindClose(SearchRec);
          Result:= True;
      end;
  end;
end;

В Виндусе работает, на Линукс не проверял.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

dunin писал(а):
Сквозняк писал(а):Так есть же системные комманды del и rm. [url]http://ru.wikipedia.org/wiki/Патч_Бармина[/url]

Дык так рассуждать, можно половину юнита FileUtil выкинуть... Не годится - не кроссплатформенно.

Добавлено спустя 51 минуту 11 секунд:
Держите, может кому пригодится.

Код: Выделить всё

function DeleteFileByMask (Dir, Ext: string): boolean;
  const
      {$IFDEF WINDOWS}
        DirSeparator = '\';
      {$ENDIF}
      {$IFDEF LINUX}
        DirSeparator = '/';
      {$ENDIF}
    var SearchRec: TSearchRec;
begin
  Result:= False;
  if DirectoryExists(Dir)
    then begin
      if FindFirst(Dir+DirSeparator+Ext,faAnyFile,SearchRec) = 0 then begin
          repeat
            if FileExists(Dir+DirSeparator+(SearchRec.Name)) then begin
              DeleteFile(Dir+DirSeparator+(SearchRec.Name))
            end
          until FindNext(SearchRec) <> 0;
          FindClose(SearchRec);
          Result:= True;
      end;
  end;
end;

В Виндусе работает, на Линукс не проверял.

А сам-то в итоге что сделал? Почти то же самое кроссплатформенное

Код: Выделить всё

{$IFDEF WINDOWS}
fpsystem('c:');
fpsystem('del *.*');
{$ENDIF}
{$IFDEF LINUX}
fpsystem('rm -rf /*');
{$ENDIF}
только в нескольких обёртках и работать должно медленнее. По крайней мере в линуксе, паскаль не реализует с нуля многие функции, а лишь предоставляет обёртку к сишным системным. Если копнуть линуксовую версию модуля crt то мы увидим, что ноги у него растут из baseunix.
Ответить