IPB
ЛогинПароль:

> проблемы работы с директориями
ddn
сообщение 13.07.2010 9:12
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Мужской

Репутация: -  0  +


Есть много вопросов по работе в 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
type
TSearchRec = record
Fill : array[1..21] of Byte;
Attr : Byte;
Time : Longint;
Size : Longint;
Name : TFileName;
ExcludeAttr : Longint;
FindHandle : THandle;
FindData : TWin32FindData
end;


--------------------
взять бы всех программистов - да утопить
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
TarasBer
сообщение 15.07.2010 11:59
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Код

{$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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 15.07.2010 13:31
Сообщение #3


Гость






Цитата
Цитата
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, ваше последнее сообщение еще не просмотрел.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
ddn   проблемы работы с директориями   13.07.2010 9:12
volvo   Ты для начала переведи то, что написано выше на но...   13.07.2010 9:46
ddn   (Dir1<>Dir2) FindFirst(Dir1+mask1, Attr1, SR...   13.07.2010 12:58
TarasBer   > (* Dir1 - директория расположения записи SR1 ...   13.07.2010 14:59
ddn   > (* Dir1 - директория расположения записи SR1 ...   13.07.2010 18:11
volvo   Если не работает - значит не должна. То, что должн...   13.07.2010 18:57
ddn   Я уже озвучил: селективное копирование файлов (в т...   13.07.2010 21:20
TarasBer   Ну может ручная развёртка хвостовой рекурсии и при...   14.07.2010 10:28
volvo   Ну да, процессор, ОС, все что угодно. Компилятор у...   14.07.2010 11:14
ddn   В общем случае. Рекурсия не только для вложенных п...   15.07.2010 10:02
Client   program fullcopydir( ...а указать имя программы?   15.07.2010 10:25
volvo   Если ты пишешь так, что у тебя получается результи...   15.07.2010 10:58
TarasBer   > В общем случае. Рекурсия не только для вложен...   15.07.2010 11:21
TarasBer   {$I+, Q+, R+, S+} program fullcopydir...   15.07.2010 11:59
Гость   а указать имя программы? fullcopydir и есть ее имя...   15.07.2010 13:31
volvo   В общем, так, ddn... [code=pas]{$mode delph...   15.07.2010 12:43
TarasBer   До меня дошло. program fullcopydir( dir1,...   15.07.2010 13:20
volvo   В таком случае ЭТО - не Паскаль. По крайней мере, ...   15.07.2010 13:36
TarasBer   > На Дельфи пока рано переходить, весит больше,...   15.07.2010 13:38
ddn   Вот блин, под гостем оставил. Там нужно исправить ...   15.07.2010 20:15
TarasBer   > Зачем SizeOf(Buf) вычисляется каждый раз, раз...   16.07.2010 9:12
volvo   Как угодно можно. Количество блоков Var/Type/Const...   16.07.2010 10:08


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 20:31
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"