Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как создать список файлов?


Автор: mkmv 2.6.2005, 14:40
есть такая утилитка - flist
Для постороения списка файлов по заданному пути.

делает файл следующего содержания:

Код

academ.sab            14.160      REPORTS/Shabl/       22.02.2005 13:18:12
akad_tmp.sab         4.788       REPORTS/Shabl/       22.02.2005 13:18:12
akadem.sab           42.442      REPORTS/Shabl/       22.02.2005 13:18:12
att_plan.sab          19.960      REPORTS/Shabl/       22.02.2005 13:18:14
config.fpw              25                                              22.02.2005 13:18:16
cont1.sab              101.185     REPORTS/Shabl/       22.02.2005 13:18:12
cont2.sab              102.357     REPORTS/Shabl/       22.02.2005 13:18:12
ConvJpg.exe          185.856     BMP/obmenbmp/      22.02.2005 13:18:12

Как написать что-либо аналогичное? + еще я хочу добавить после даты - контрольную сумму.

Код

ConvJpg.exe          185.856     BMP/obmenbmp/      22.02.2005 13:18:12    CHECKSUM


Может у кого есть мысли?

Автор: _hunter 2.6.2005, 14:48
делай рекурсивный обход каталогов ( начиная с текущего ) и выводи относительный путь.
сумму тоже не проблема приписать...

Автор: mkmv 2.6.2005, 14:51
smile

smile Или хотя бы намек - с пом. каких функций

Сумму уже написал.

Автор: _hunter 2.6.2005, 15:29
FindFirst() / FindNext()
( ну и поиск по форуму: тут таких тем поднималось... )

Автор: X-Vlad 2.6.2005, 16:00
вот что то типа этого.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
 sr: TSearchRec;
 filepath:string;
 MyFileName, MyFileSize, MyFileTime, MyFileCheckSum:string;
begin
try
 filepath:='c:\windows';
 if filepath[length(filepath)]<>'\' then
  filepath:=filepath+'\';
 if FindFirst(filepath+'*.*', faanyfile, sr) = 0 then
  begin
   repeat
    if sr.Attr <> faDirectory then
     begin
      MyFileName:=sr.Name;
      MyFileName:=sr.Name;
      MyFileSize:=inttostr(sr.Size);
      MyFileTime:=DateTimeToStr(FileDateToDateTime(FileAge(filepath+sr.Name)));
      memo1.Lines.Add(MyFileName+'        '+MyFileSize+'       '+MyFileTime+'       '+FilePath);
     end
   until FindNext(sr) <> 0;
   FindClose(sr);
  end;
except
end;
end;


в коде есть ошибочка.. но у меня щас нету времени с этим разбиратся

Автор: mkmv 2.6.2005, 19:23
Спасибо! Ошибочку найду...не проблема. Вопрос - этот код строит лист по всем файлам\поддиректориям ну и т.д.??
Я как понял - нет smile Или в этом и есть ошибка?? ;)

Т.е. мне надо чтобы прога прочесала весь c:\windows до последнего файла+ указала ОТНОСИТЕЛЬНЫЙ путь к нему.

Типа:

explorer.exe 14.160 22.02.2005 13:18:12 находится в корне относительно C:\windows
shell32.dll 4.788 System32\ 22.02.2005 13:18:12 находится в C:\windows\System32

Автор: Albinos_x 2.6.2005, 19:35
если не ошибаюсь папки он пропускает...нужно сделать функцию из этого кода, и при обнаружении папки, не пропускать её, а делать рекурсивный вызов этой функции...

Автор: Quadr0 2.6.2005, 20:58
...

Автор: Albinos_x 2.6.2005, 22:21
Цитата(Quadr0 @ 2.6.2005, 20:58)


Цитата
Цитата(Albinos_x @ 2.6.2005, )
если не ошибаюсь папки он пропускает...

ОН НЕ пропускает папки, если параметр задан faAnyFile и расширение *.*


если по внимательней посмотреть, то

Код
...
if FindFirst(filepath+'*.*', faanyfile, sr) = 0 then    
  begin    
   repeat    
    if sr.Attr <> faDirectory then    
     begin    
      MyFileName:=sr.Name;    
      MyFileName:=sr.Name;    
      MyFileSize:=inttostr(sr.Size);    
      MyFileTime:=DateTimeToStr(FileDateToDateTime(FileAge(filepath+sr.Name)));    
      memo1.Lines.Add(MyFileName+'        '+MyFileSize+'       '+MyFileTime+'       '+FilePath);    
     end    
   until FindNext(sr) <> 0;
...


В коде папки пропускаются (sr.Attr <> faDirectory) и не добавляются в список найденных файлов...

Цитата
Цитата(Albinos_x @ 2.6.2005, )
делать рекурсивный вызов этой функции...

Проще говоря, выдели поиск в отдельную процедуру и при обнаружении папки вызывай процедуру из самой процедуры:
Код

procedure SearchFiles(const Path: string);
var
...
begin
...
if ExtractFileExt(Sr.Name) = '.fld' then
  SearchFiles(Path + Sr.Name + '\'); //вызывает сама себя (рекурсивно)
end;


Именно про это я и говорил...

Цитата
нужно сделать функцию из этого кода, и при обнаружении папки, не пропускать её, а делать рекурсивный вызов этой функции...

Автор: Quadr0 3.6.2005, 00:18
...

Автор: X-Vlad 3.6.2005, 13:13
измени код на:
Код

...
if FindFirst(filepath+'*.*', faanyfile, sr) = 0 then    
  begin    
   repeat    
      MyFileName:=sr.Name;    
      MyFileName:=sr.Name;    
      MyFileSize:=inttostr(sr.Size);    
      MyFileTime:=DateTimeToStr(FileDateToDateTime(FileAge(filepath+sr.Name)));    
      memo1.Lines.Add(MyFileName+'        '+MyFileSize+'       '+MyFileTime+'       '+FilePath);    
   until FindNext(sr) <> 0;
...



будет выводить все подряд. и папки тоже.

а ошибка у меня была в том что если sr.name='.' or sr.name='..' - то получить дату невозможно.. и прога вываливалась. поиграйся с этим . у меня просто времени нету smile работа, да еще и сесия началась )))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)