Цитата
Цитата
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, ваше последнее сообщение еще не просмотрел.