Цитата
Цитата
program  fullcopydir(
...
а указать имя программы?
 fullcopydir и есть ее имя.
Цитата
Разумеется, я ж сказал: в заголовке процедуры нельзя описывать типы, а что делаешь ты?
И что за параметр H, как не попытка описать новый тип прямо на месте? Опиши заранее, потом используй...
Понял.
Я то подумал про параметр функционального типа.
Значит программы не могут иметь параметров. Придется задавать их в виде констант.
Цитата
Зачем тебе общий случай? Универсальных вещей не существует.
Речь не об этой программе, в других программах может понадобиться глубокая рекурсия.
Цитата
> Иначе, зачем Eof если есть IOResult ?
Для удобства.
А у меня идиосинкразия. Опять же вопрос стиля.
Цитата
> Отладчик это компенсация плохого хелпа. 
ЛОЛШТО
Отладчик показывает где и в чем нарушен синтаксис и смысл конструкций языка. Можно угадать правила языка, даже если хелпа нет.
Цитата
> Не кристально ясный, неполный, не родного языка хелп - это не хелп. 
Транслате.гугл.ру
Пользуюсь Транслате, перевод неважнецкий.
Но если хелп скупой на объяснения, да еще и неполный более чем на половину.
На Дельфи пока рано переходить, весит больше, багов больше.
Цитата
Код
  l = min(length(dir1), length(dir2));    {ЩО ЦЕ?!}
Константное выражение, что нельзя?
Ладно, сделаем переменной.
Цитата
Код
    return(true)              {ЩО ЦЕ?! Тяжёлое наследие Си?}
Это заглушка.
Вместо нее вставить нужный код.
Цитата
Код
      h : [0..maxh];                {ЩО ЦЕ?!}
Выражение для типа. Да, уже говорилось, исправим.
Исправленный код
Код
{$I+, Q+, R+, S+}
program fullcopydir;
const
  dir1 = 'вставить нужный путь'; (* исходная директория, содержимое всех уровней вложенности которой селективно копируется *)
  dir2 = 'вставить нужный путь'; (* исходная директория, содержимое всех уровней вложенности которой становится результатом селективного копирования *)
  prov = true; (* необходимость проверки исходной директории dir1 и ее копии dir2 на вложенность *)
  maxh = 127; (* предел глубины расположения файлов *)
type
  dh = [0..maxh]; (*диапазон глубины директорий *)
var
  i, l : byte; (* вспомогательные переменные, соответсвенно, номер символа абсолютного пути и минимум длины абсолютного пути *)
  attr : word; (* атрибуты исходной директории dir1 *)
  time : longint; (* время ? исходной директории dir1 *)
  f, d : file; (* вспомогательные дескрипторы, соответственно, исходной директории dir1 и ее копии *)
  function
    sel(
      attr : byte; (* атрибуты проверяемого файла *)
      time : longint; (* время ? проверяемого файла *)
      size : longint; (* размер проверяемого файла *)
      name : string (* имя проверяемого файла *)
    ) : boolean; (* функция селекции на копирование проверяемого файла по некоторым полям его паспорта *)
  begin
    return(true)
  end;
  procedure
    copydir(
      h : dh; (* глубина директории текущей dir1 и содержимых ею файлов *)
      b0 : boolean; (* выполнение текущей директорией dir1 условия селекции, т.е. ее затребованность для копирования *)
      ln : byte; (* максимальная длина абсолютного пути к содержимому текущей директории dir1 и к ее копии *)
      dir1, dir2 : string (* текущие директории, содержимое всех уровней вложенности которых, соответственно, селективно копируется и становится результатом селективного копирования *)
    );
  var
    e : boolean; (* условие успешного завершения текущего шага поиска *)
    i : byte; (* буферная переменная для копируемого байта *)
    f, g : file; (* вспомогательные дескрипторы, соответственно, копируемых и являющихся копиями файлов *)
    b : boolean; (* текущее значение условия сохранения копии директории dir1 *)
    sr : tsearchrec; (* паспорт найденных файлов и дескриптор поиска *)
  begin
    b := b0; (* начальное значение условия сохранения копии директории dir1 *)
    e := findfirst(dir1+'*', anyfile, sr)=0; (* поиск первого файла директории dir1, условие его нахождения *)
    while e do (* первый либо следующий файл директории dir1 найден *)
      if (sr.attr and directory)=directory then (* найденный файл - директория *)
        if (sr.name='.') or (sr.name='..') then (* найденный файл - специальная поддиректория, игнорируется *)
          e := findnext(sr)=0 (* поиск следующего файла директории dir1, условие его нахождения *)
        else (* найденный файл - обычная поддиректория *)
          begin (* копирование найденной поддиректории *)
            createdir(dir2+sr.name+'\'); (* создание пустой копии найденной поддиректории *)
            assign(g, dir2+sr.name+'\'); (* дескриптор копии найденной поддиректории *)
            setfattr(g, sr.attr); (* копирование атрибутов найденной поддиректории *)
            setftime(g, sr.time); (* копирование времени ? найденной поддиректории *)
            copydir(
              h+1, (* глубина найденной поддиректории и содержимых ею файлов *)
              sel(sr.attr, sr.time, sr.size, sr.name), (* выполнение условия селекции найденной поддиректорией, т.е. ее затребованность для копирования *)
              ln+length(sr.name)+1, (* максимум длины абсолютного пути к содержимому найденной поддиректории и ее копии *)
              dir1+sr.name+'\', (* найденная поддиректория *)
              dir2+sr.name+'\' (* копия найденной поддиректории *)
            ); (* селективное копирование содержимого всех уровней вложенности найденной поддиректории; удаление копии найденной поддиректории, если она пустая и не требуется *)
            e := findnext(sr)=0 (* поиск следующего файла директории dir1, условие его нахождения *)
          end
      else (* найденный файл - не директория *)
        begin
          if sel(sr.attr, sr.time, sr.size, sr.name) then (* найденный файл выполняет условию селекции, т.е. затребован для копирования *)
            begin  (* копирование найденного файла *)
              b := true; (* условие сохранения копии директории dir1 выполнено *)
              assign(f, dir1+sr.name); (* дескриптор найденного файла *)
              assign(g, dir2+sr.name); (* дескриптор копии найденного файла *)
              reset(f, 1); (* открытие найденного файла для побайтного чтения *)
              rewrite(g, 1); (* пересоздание и открытие копии найденного файла для побайтной записи *)
              (* копирование содержимого найденного файла *)
              while not eof(f) do (* конец найденного файла не достигнут *)
                begin
                  read(f, i); (* чтение текущего байта найденного файла *)
                  write(g, i) (* копирование текущего байта найденного файла *)
                end;
              close(f); (* закрытие найденного файла *)
              close(g); (* закрытие копии найденного файла *)
              setfattr(g, sr.attr); (* копирование атрибутов найденного файла *)
              setftime(g, sr.time) (* копирование времени ? найденного файла *)
            end;
          e := findnext(sr)=0 (* поиск следующего файла директории dir1, условие его нахождения *)
        end;
    (* первый либо следующий файл директории dir1 не найден *)
    findclose(sr); (* высвобождаем ресурсы поиска в директории dir1 *)
    (* проверка конечного условия сохранения копии директории dir1 = затребованность для копирования самой dir1 или некоторых содержимых ею файлов *)
    if not b then (* в директории dir2 нет скопированных файлов и сама она не требуется *)
      begin
        assign(g, dir2); (* дескриптор директории dir2 *)
        setfattr(g, $00); (* снятие флага 'только для чтения' с директории dir2 *)
        erase(g) (* удаление пустой директории dir2 *)
      end
  end;
begin
  if prov then (* необходима проверка исходной директории dir1 и ее копии *)
    begin
      (* проверка исходных директорий на вложенность *)
      i := 1;
      l := min(length(dir1), length(dir2));
      while i<=l and dir1[i]=dir2[i] do
        i := i+1;
      if i>l then (* исходные директории вложены *)
        halt (* аварийная остановка программы *)
    end;
  assign(f, dir1); (* дескриптор исходной директории dir1 *)
  getfattr(f, attr); (* чтение атрибутов исходной директории dir1 *)
  getftime(g, time); (* чтение времени ? исходной директории dir1 *)
  createdir(dir2); (* создание пустой копии исходной директории dir1 - директории dir2 *)
  assign(g, dir2); (* дескриптор директории dir2 *)
  setfattr(g, attr); (* копирование атрибутов исходной директории dir1 *)
  setftime(g, time); (* копирование времени ? исходной директории dir1 *)
  copydir(
    0, (* глубина исходной директории dir1 и содержимых ею файлов *)
    true, (* исходная директория dir1 требуется для копирования *)
    max(length(dir1),length(dir2)),
    dir1, (* исходная директория dir1 *)
    dir2 (* копия исходной директории dir1 *)
  ) (* селективное копирование содержимого всех уровней вложенности исходной директории dir1 *)
end.
Теперь отладчик пишет просто:
Fatal: Compilation aborted
volvo, ваше последнее сообщение еще не просмотрел.