![]() |
![]() |
ddn |
![]() ![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Репутация: ![]() ![]() ![]() |
Есть много вопросов по работе в BP7, TMT (3.90), FPC (2.4.0.i386-win32) под WinXP:
1) верно ли, процедуры FindFirst и FindNext могут одновременно работать с несколькими директориями и даже с одной директорией через несколько указателей; 2) верно ли, что указатель поиска в директории определяется только записью файла SR (тип TSearchRec), но не директорией в которой она расположена, т.е. только по записи файла SR возможно непосредственно определить ее директорию и ее расположение в директории; 3) верно ли, что вызов FindNext(SR) возвращает в SR следующую запись (если она есть, если нет - SR неопределено или исходное значение?) в директории ее (исходной записи SR) расположения, а не в директории из последнего вызова процедуры FindFirst; 4) верно ли, что вызов FindClose(SR) прекращает поиск (работу с указателем) в директории расположения записи, а не в директории из последнего вызова процедуры FindFirst, поиск в других директориях не прекращается (непонятно, зачем вообще нужна эта процедура, если вся работа идет с данными из записи SR); - без выполнения данных взаимосвязанных утверждений рекурсивный поиск в директориях НЕВОЗМОЖЕН (по крайней мере, без создания списков их содержимого), далее: 5) верно ли, что путь к директории в вызове процедуры FindFirst должен заканчиваться разделителем '\'; 6) возможна ли проверка существования файла, директории или лог. диска по его имени/полному_имени без использования процедур FindFirst и FindNext; 7) возможна ли работа с текущей директорией (получение абс. пути, изменение); 8) верно ли, что имена директорий SR.name в их записях SR из их наддиректорий не содержат разделителя '\'; 9) верно ли, что записи в любой не изменившейся директории при каждой ее обработке процедурами FindFirst и FindNext выдаются в одном и том же порядке (лексикографическом по именам?); 10) как обеспечить работу с длинными именами файлов (как вызвать Win под FPC); 11) верно ли, что поле Time в TSearchRec - это время создания файла (если нет, как узнать/изменить время создания), или это время его последнего изменения/открытия; 12) что представляют собой неизвестные компилятору типы полей записи SR файла в директории под Win: TFileName (=string ?), THandle, TWin32FindData, каким характеристикам файла они и Fill (тип array[1..21] of Byte) отвечают; Win32 target -------------------- взять бы всех программистов - да утопить
|
![]() ![]() |
TarasBer |
![]()
Сообщение
#2
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Код {$I+, Q+, R+, S+} program fullcopydir( dir1, dir2 : string; prov : boolean; ); {ЩО ЦЕ?!} const maxh = 127; l = min(length(dir1), length(dir2)); {ЩО ЦЕ?!} var i : byte; attr : word; time : longint; f, d : file; function sel( attr : byte; time : longint; name : string; ) : boolean; begin return(true) {ЩО ЦЕ?! Тяжёлое наследие Си?} end; procedure copydir( h : [0..maxh]; {ЩО ЦЕ?!} b0 : boolean; ln : byte; dir1, dir2 : string -------------------- |
Гость |
![]()
Сообщение
#3
|
Гость ![]() |
Цитата Цитата program 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, ваше последнее сообщение еще не просмотрел. |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 20:31 |