Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > команда Dir


Автор: Martisha 28.11.2008, 08:19
добрый день)
вопрос такой:
есть код, в котором сканируется папка и имена найденных в ней текстовых файлов добавляются в ListBox, что нужно добавить в код чтобы выводилась вместе с именем и дата создания файла? 
вот код:
Код

Procedure TForm1.ScanFolder(Dir:String);
   Var
 SearchRec:TSearchRec;
begin
 try
  if Dir<>'' then Dir:=IncludeTrailingPathDelimiter(Dir); 
FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then 
   repeat
      begin
       if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.TXT' then 
       EditFile(Dir+SearchRec.name); //здесь мы вызываем функцию и присваиваем имя файла
      end;
   until FindNext(SearchRec)<>0;
  FindClose(SearchRec);
 finally
 end;
end;

Автор: mrbrooks 28.11.2008, 08:53
Martisha, в данном случае ты делаешь велосипед на мой взгляд. в VCL есть компонент FileListBox. 
Его свойство
Drive - определяет диск 
Directory - определяет каталог - по умолчанию корневой
Mask -  определяет фильтрацию (в твоем случае - *.txt) 

Автор: AntonN 28.11.2008, 08:56
дата создания хранится в SearchRec.FindData.ftCreationTime, передавай еще одним параметром в EditFile()

Автор: aleksh 28.11.2008, 09:04
у структуры TSearchRec помимо значения name есть и date, можно его через datetostr() передавать в listbox, например функцие EditFile() передавать еще одну переменную
но все же, Martisha, уверенна, что именно это надо?

Автор: Martisha 28.11.2008, 09:08
Цитата(mrbrooks @  28.11.2008,  08:53 Найти цитируемый пост)
в VCL есть компонент FileListBox. 

подробнее..если можно smile 


Цитата(AntonN @  28.11.2008,  08:56 Найти цитируемый пост)
дата создания хранится в SearchRec.FindData.ftCreationTime

ятак делала, но вылазят ошибки(

Добавлено через 45 секунд
Цитата(aleksh @  28.11.2008,  09:04 Найти цитируемый пост)
но все же, Martisha, уверенна, что именно это надо?

да, это очень нужно

Добавлено через 5 минут и 6 секунд
Цитата(aleksh @  28.11.2008,  09:04 Найти цитируемый пост)
у структуры TSearchRec помимо значения name есть и date

на date ругается

Автор: aleksh 28.11.2008, 09:28
Цитата(Martisha @  28.11.2008,  09:08 Найти цитируемый пост)
на date ругается

видмо память меня подводит. в справке по TSearchRec все довольно хорошо описано, есть там атрибут хранящий дату и время, в переменно, если не путаю, типа datetime, ее нужно отдельно в строку переводить, может по этому ошибки?

Автор: Martisha 28.11.2008, 09:32
Цитата(aleksh @  28.11.2008,  09:28 Найти цитируемый пост)
может по этому ошибки? 

может..

Цитата(aleksh @  28.11.2008,  09:28 Найти цитируемый пост)
в справке по TSearchRec все довольно хорошо описано

сейчас почитаю)

Автор: mrbrooks 28.11.2008, 09:37
Цитата(Martisha @  28.11.2008,  09:32 Найти цитируемый пост)
в справке по TSearchRec все довольно хорошо описано

сейчас почитаю) 


о FileListBox кстати тоже  smile 


Автор: Martisha 28.11.2008, 10:03
Цитата(mrbrooks @  28.11.2008,  09:37 Найти цитируемый пост)
о FileListBox кстати тоже   

 smile 

Автор: Christoph 28.11.2008, 12:11
Цитата(aleksh @ 28.11.2008,  09:04)
у структуры TSearchRec помимо значения name есть и date

Там нету такого поля date


FindData (Windows only) contains additional information such as the file creation time, last access time, and both the long and short file names.

Автор: THandle 28.11.2008, 12:15
Код

  TSearchRec = record
    Time: Integer;
    Size: Int64;
    Attr: Integer;
    Name: TFileName;
    ExcludeAttr: Integer;
{$IFDEF MSWINDOWS}
    FindHandle: THandle  platform;
    FindData: TWin32FindData  platform;
{$ENDIF}
{$IFDEF LINUX}
    Mode: mode_t  platform;
    FindHandle: Pointer  platform;
    PathOnly: String  platform;
    Pattern: String  platform;
{$ENDIF}
  end;


Дату и время хранит поле Time. smile

Автор: aleksh 28.11.2008, 12:38
toTHandle: спасибо
все таки, пора по новой инсталить делфи, а то как-то неловко, в самом деле...

Автор: Martisha 28.11.2008, 12:55
Цитата(Christoph @  28.11.2008,  12:11 Найти цитируемый пост)
Там нету такого поля date

точно)

THandle, и что с этим делать?  smile

Добавлено через 2 минуты и 12 секунд
mrbrooks
Цитата(mrbrooks @  28.11.2008,  08:53 Найти цитируемый пост)
Mask -  определяет фильтрацию (в твоем случае - *.txt) 

ну с этим понятно, а вот
Цитата(mrbrooks @  28.11.2008,  08:53 Найти цитируемый пост)
Drive - определяет диск 
Directory - определяет каталог - по умолчанию корневой

это не совсем ясно..в справке очень мало написано

Автор: aleksh 28.11.2008, 13:01
Цитата(Martisha @  28.11.2008,  12:55 Найти цитируемый пост)
и что с этим делать?

конвертировать в нужный формат smile

Автор: Christoph 28.11.2008, 13:13
FindData хранит время создания файла. Валер ты читал мой пост выше? Хотя написано что в Time хранться тоже время создания, надо проверить

Автор: Martisha 28.11.2008, 13:57
Цитата(Christoph @  28.11.2008,  13:13 Найти цитируемый пост)
написано что в Time хранться тоже время создания, надо проверить

я пробовала, только в результате выводится число имесяц правильно, а дальше какой то набор цифр

Добавлено через 1 минуту и 26 секунд
Цитата(Christoph @  28.11.2008,  13:13 Найти цитируемый пост)
FindData хранит время создания файла

а с FindData сложнее, не совсем понятно как с ним работать

Добавлено через 2 минуты и 5 секунд
и всправке про FindData ненаписано практически ничего

Автор: Christoph 28.11.2008, 14:17
с Time у меня выводит набор чисел...только через FindData нада, если получится выложу ....

Автор: aleksh 28.11.2008, 14:22
Martisha, надо изменить формат вывода даты и времени, делфи под рукой нет, код привести не могу, но почитать об этом можно в справке по типу timedate (или datetime, где же моя память)

Автор: THandle 28.11.2008, 14:24
Стоп. Что вам тут надо? Вывести дату файла? Так есть же функция FileDateToDateTime например:

Код

ShowMessage(DateToStr(FileDateToDateTime(SearchRec.Time)));

Автор: Martisha 28.11.2008, 14:26
вот такой вот код нашла, осталось только добавить в ListBox, чтоб рядом с названием файла отображалось:
Код

procedure TForm1.Button5Click(Sender: TObject);
Var
  Data: TWin32FindData;
  H: THandle;
  SysTime: TSystemTime;
  Date: TDateTime;
begin
 H := FindFirstFile(PChar('c:\ROU99STAT'), Data);
  If H <> Cardinal(-1) Then
  Try
    FileTimeToSystemTime(Data.ftCreationTime, SysTime);
    Date := SystemTimeToDateTime(SysTime);
    { Date }
    ShowMessage('дата создания ' + DateToStr(Date));
    { Time }
    ShowMessage(эвремя создания ' + TimeToStr(Date));
  Finally
    Windows.FindClose(H);
  End;
end;


Добавлено через 5 минут и 13 секунд
THandle, мне нужнои дату и времясоздания папки получить и чтоб все это выводилось в ListBox, т.е. там должно выводиться название файла и имя..

Добавлено через 13 минут и 48 секунд
Код

EditFile(Dir+SearchRec.name+DateToStr(FileDateToDateTime(SearchRec.Time)));

так только число выводит, а время как вывести?

Автор: Rrader 28.11.2008, 14:43
Martisha, нашли мой старый код smile 
Код

procedure TForm1.ScanFolderForTxt(Folder: String);
var
  Data: TWin32FindData;
  Res: DWORD;
  SysTime: TSystemTime;
  LocalTime: TFileTime;
  S: String;
  Date: TDateTime;
begin
  Folder := IncludeTrailingPathDelimiter(Folder);
  Res := FindFirstFile(PChar(Folder + '*.txt'), Data);
  if Res <> INVALID_HANDLE_VALUE then
  try
    with Form1.ListBox1.Items do
    begin
      BeginUpdate;
      try
        repeat
          FileTimeToLocalFileTime(Data.ftCreationTime, LocalTime);
          FileTimeToSystemTime(LocalTime, SysTime);
          Date := SystemTimeToDateTime(SysTime);
          S := Folder + Data.cFileName + ' (Дата создания: ' +
            DateToStr(Date) + ')';
          Add(S);
        until not FindNextFile(Res, Data);
      finally
        EndUpdate;
      end;
    end;  
  finally
    Windows.FindClose(Res);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ScanFolderForTxt('C:\MyFolder\');
end;

P.S.
Поправил

Автор: Martisha 28.11.2008, 14:49
Цитата(Christoph @  28.11.2008,  14:17 Найти цитируемый пост)
только через FindData нада, если получится выложу 

было бы неплохо, самой не получается разобраться(

Добавлено через 2 минуты и 21 секунду
Цитата(Rrader @  28.11.2008,  14:43 Найти цитируемый пост)
Martisha, нашли мой старый код  

ага))

Добавлено через 12 минут и 44 секунды
вернее ее кто то ужеизменил и я уже нашла его)

Rrader, помоги мне разобраться в своейпроцедуре, пока ничего не пойму

Автор: Christoph 28.11.2008, 15:11
Мой код медленееsmile 
Чтоб показать что мой код тупит допишу еще вот что
Код

Screen.Cursor := crHourGlass;

 smile 
Код

procedure TForm1.Button1Click(Sender: TObject);
Var SR:TSearchRec;
    FindRes:Integer;
    SystemTime: TSystemTime;
    Date:TDateTime;
begin
ListBox1.Clear;

FindRes:=FindFirst('c:\Downloads\*.rar',faAnyFile,SR);
Screen.Cursor := crHourGlass;
While FindRes=0 do
   begin
         FileTimeToSystemTime(SR.FindData.ftCreationTime, SystemTime);
         Date:=SystemTimeToDateTime(SystemTime);
         ListBox1.Items.Add(SR.Name+DateToStr(Date));
      FindRes:=FindNext(SR);
   end;
FindClose(SR);
end;

Автор: THandle 28.11.2008, 15:27
Christoph, твой код будет не слабо тупить на папках с большим количеством файлов при обновлении ListBox'а. Тут нужен Begin(End)Update.

Где try..finally?

Почему оформления такое корявое?))

Автор: Christoph 28.11.2008, 15:29
Цитата(THandle @ 28.11.2008,  15:27)
Christoph, твой код будет не слабо тупить на папках с большим количеством файлов при обновлении ListBox'а. Тут нужен Begin(End)Update.

Где try..finally?

Почему оформления такое корявое?))

Это кто тебе сказал Rrader?   smile 

Автор: CodeMonkey 28.11.2008, 15:38
http://transl-gunsmoker.blogspot.com/2008/11/blog-post_24.html.

Автор: THandle 28.11.2008, 15:48
Christoph, ну а ты возьми попробуй свой код и код Rrader'а на папке Windows допустим. Там файлов много. Вот и посмотри на ListBox.

Насчет оформления: разве хорошо оформлено?
Почитай допустим это:

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=802

Насчет try..finally - должно присутствовать при всех освобождениях ресурсов в том числе и FindClose.

А вообще да, я Rrader'а поддерживаю  smile 

Автор: Poseidon 28.11.2008, 16:57
Цитата(THandle @  28.11.2008,  15:48 Найти цитируемый пост)
Насчет try..finally - должно присутствовать при всех освобождениях ресурсов в том числе и FindClose.
А по-моему try..finally должно присутствовать там, где хотя бы теоритически может возникнуть ошибка. А какая ошибка может возникнуть в приведенном коде? Только Out of memory при создании SR. Но ведь при этом SR и не создасться. try..finally тут лишнее, а вот Begin(End)Update действительно нужен smile

И оформление - это уже дело каждого. Строгих стандартов в оформлении нет. По мне так код сволне читаем.

Автор: CodeMonkey 28.11.2008, 17:01
Цитата(Poseidon @  28.11.2008,  16:57 Найти цитируемый пост)
 А какая ошибка может возникнуть в приведенном коде? Только Out of memory при создании SR.

Поручишся? Поддерживаю THandle.

Добавлено через 44 секунды
Цитата(Poseidon @  28.11.2008,  16:57 Найти цитируемый пост)
И оформление - это уже дело каждого.

...за исключением случая, когда работаешь в команде или пишешь для других, как сейчас...

Автор: Martisha 1.12.2008, 09:02
Christoph, очень странно, при использовании вашего кода выходит совсем не та дата..


Rrader, пробовала использовать ваш старый код, но почему то в ListBox ничего не добавляется..
что означает эта строка? вернее куда добавляется строка S?
Код

 Add(S);

и эта еще: 
Код

with Form1.ListBox1.Items do

Автор: Martisha 1.12.2008, 10:33
почему то когда делаю так:
Код

procedure TForm1.ScanFolderForTxt(Folder: String);
var
  Data: TWin32FindData;
  Res: DWORD;
  SysTime: TSystemTime;
  S: String;
  Date: TDateTime;
begin
  IncludeTrailingPathDelimiter(Folder);
  Res := FindFirstFile(PChar(Folder + '*.txt'), Data);
  if Res <> INVALID_HANDLE_VALUE then
  try
    with Form1.ListBox1.Items do
    begin
      BeginUpdate;
      try
        repeat
          FileTimeToSystemTime(Data.ftCreationTime, SysTime);
          Date := SystemTimeToDateTime(SysTime);
          S := Folder + Data.cFileName + ' (Время создания: ' + DateToStr(Date) + ')';
          Add(S);
        until not FindNextFile(Res, Data);
      finally
        EndUpdate;
      end;
    end;
  finally
    Windows.FindClose(Res);
  end;
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
 ScanFolderForTxt('c:\ROU99STAT');
end;


после выполнения
Код

  if Res <> INVALID_HANDLE_VALUE then

идет сразу в конецпроцедуры..
а если я комментю это выражение, то выводит в ListBox название папки а не файла и дату странную..год вообще нет тот((
почему так?

Автор: aleksh 1.12.2008, 11:15
попробуй не комментить, а поставить тело цикла, после repeat первой строчкой

Автор: CodeMonkey 1.12.2008, 11:34
Код
Folder := IncludeTrailingPathDelimiter(Folder);
?

Автор: Martisha 1.12.2008, 13:04
Цитата(aleksh @  1.12.2008,  11:15 Найти цитируемый пост)
попробуй не комментить, а поставить тело цикла, после repeat первой строчкой 

так ошибки вылазят

Цитата(CodeMonkey @  1.12.2008,  11:34 Найти цитируемый пост)
код Pascal/Delphi
1:

Folder := IncludeTrailingPathDelimiter(Folder);





а так, выдает дату..только она почему то одинаковая для всех записей и совсем даже не та(

Добавлено через 3 минуты и 29 секунд
мне вообще даже не дата важнее а время создания файла, как нибудь возможно время вытащить? часы, минуты там...это важно, как не знаю( дату то я сама могу, а вот часы и минуты не знаю как.. smile 

Автор: aleksh 1.12.2008, 13:59
в справке по типу TDateTime опмано как получать дату, а как время

Автор: Rrader 1.12.2008, 14:15
Цитата(Martisha @  1.12.2008,  19:04 Найти цитируемый пост)
только она почему то одинаковая для всех записей и совсем даже не та(

Проверьте и сравните эту дату с той, что в свойствах файла в проводнике. Должно совпадать.

Цитата(Martisha @  1.12.2008,  19:04 Найти цитируемый пост)
 как нибудь возможно время вытащить?

Код

procedure TForm1.ScanFolderForTxt(Folder: String);
var
  Data: TWin32FindData;
  Res: DWORD;
  SysTime: TSystemTime;
  LocalTime: TFileTime;
  S: String;
  Date: TDateTime;
begin
  Folder := IncludeTrailingPathDelimiter(Folder);
  Res := FindFirstFile(PChar(Folder + '*.txt'), Data);
  if Res <> INVALID_HANDLE_VALUE then
  try
    with Form1.ListBox1.Items do
    begin
      BeginUpdate;
      try
        repeat
          FileTimeToLocalFileTime(Data.ftCreationTime, LocalTime);
          FileTimeToSystemTime(LocalTime, SysTime);
          Date := SystemTimeToDateTime(SysTime);
          S := Folder + Data.cFileName + ' (Время создания: ' + TimeToStr(Date) + ')';
          Add(S);
        until not FindNextFile(Res, Data);
      finally
        EndUpdate;
      end;
    end;
  finally
    Windows.FindClose(Res);
  end;
end;

Автор: Martisha 1.12.2008, 14:47
Rrader, так выводится текущее время, а не время создания папки  smile 

дату я так вывела, причем она выводится отдельно в другом ListBox-е, что удобнее для меня в дальнейшей работе..вот со временем только не понятно.. smile 
вот вывод даты создания папки:
Код

Procedure TForm1.ScanFolder(Dir:string);
Var
 SearchRec:TSearchRec;
begin
 try
  if Dir<>'' then Dir:=IncludeTrailingPathDelimiter(Dir);
  if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
   repeat
      begin
       if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.TXT' then
       begin
       EditFile(Dir+SearchRec.name);
       EditTime(DateToStr(FileDateToDateTime(SearchRec.Time)));
       end;
      end;
   until
  FindNext(SearchRec)<>0;
  FindClose(SearchRec);
 finally
 end;
end;

procedure TForm1.EditFile(FileName:string);
begin
  ListBox1.Items.add(filename);
 end;
procedure TForm1.EditTime(filetime:string);
begin
  ListBox3.Items.add(filetime);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 ScanFolder('c:\ROU99STAT');
end;


может что нибудь в моем коде добавить возможно для вывода времени? 

Автор: CodeMonkey 1.12.2008, 15:00
Цитата(Martisha @  1.12.2008,  14:47 Найти цитируемый пост)
может что нибудь в моем коде добавить возможно для вывода времени?

DateToStr заменить на TimeToStr

Автор: Martisha 1.12.2008, 15:06
Цитата(CodeMonkey @  1.12.2008,  15:00 Найти цитируемый пост)
DateToStr заменить на TimeToStr

 smile точно!!!
пасибки всем)))
вопрос закрыт!  smile  

Автор: CodeMonkey 1.12.2008, 15:09
http://transl-gunsmoker.blogspot.com/2008/11/blog-post_8830.html.

Добавлено @ 15:20
Цитата(Rrader @  1.12.2008,  14:15 Найти цитируемый пост)
Проверьте и сравните эту дату с той, что в свойствах файла в проводнике. Должно совпадать.

Неа, в первом варианте (как и Christoph) забыл из UTC перевести в местное время.

Добавлено @ 15:24
Цитата(Martisha @  1.12.2008,  15:06 Найти цитируемый пост)
вопрос закрыт!


1. Всё же используйте правильно try/finally:
Код
procedure TForm1.ScanFolder(Dir: String);
var
  SearchRec: TSearchRec;
begin
  if Dir <> '' then
    Dir := IncludeTrailingPathDelimiter(Dir);
  if FindFirst(Dir+'*.*', faAnyFile, SearchRec) = 0 then
  try
    repeat
      ...
    until FindNext(SearchRec) <> 0;
  finally
    FindClose(SearchRec);
  end;
end;


2. SearchRec.Time - это время в формате DOS. Оно имеет низкую точность. Если вы сравните вывод своей программы с тем, что показывает Проводник - то увидите разницу в несколько секунд по времени. Лучше бы вам использовать метку времени записанную в SearchRec.FindData.ftCreationTime - это точное время. 
Код
var
  LocalTime: TFileTime;
  SysTime: TSystemTime;
...
    repeat
       if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.TXT' then
       begin
         FileTimeToLocalFileTime(SearchRec.FindData.ftCreationTime, LocalTime);
         FileTimeToSystemTime(LocalTime, SysTime);

         EditFile(Dir+SearchRec.name);
         EditTime(TimeToStr(SystemTimeToDateTime(SysTime)));
       end;     
    until FindNext(SearchRec) <> 0;
...


3. Кроме того, TSearchRec.Time эквивалентно TSearchRec.FindData.ftLastWriteTime - т.е. последней дате модификации, а вовсе не времени создания файла.

Автор: Martisha 1.12.2008, 15:40
CodeMonkey, спасибо, учту  smile 

Автор: Martisha 1.12.2008, 15:56
Цитата(CodeMonkey @  1.12.2008,  15:09 Найти цитируемый пост)
var
  LocalTime: TFileTime;
Код
  
SysTime: TSystemTime;
...
    repeat
       if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.TXT' then
       begin
         FileTimeToLocalFileTime(SearchRec.FindData.ftCreationTime, LocalTime);
         FileTimeToSystemTime(LocalTime, SysTime);

         EditFile(Dir+SearchRec.name);
         EditTime(TimeToStr(SystemTimeToDateTime(SysTime)));
       end;     
    until FindNext(SearchRec) <> 0;

...



и все равно, так выдается не то время(..в принципе разница не существенна, так что пойдет и так!  smile 

Автор: Rrader 1.12.2008, 16:00
Цитата(CodeMonkey @  1.12.2008,  21:09 Найти цитируемый пост)
Неа, в первом варианте (как и Christoph) забыл из UTC перевести в местное время.

Блин, точно, и с Folder ошибсяsmile 

Автор: CodeMonkey 1.12.2008, 16:17
Цитата(Martisha @  1.12.2008,  15:56 Найти цитируемый пост)
и все равно, так выдается не то время(..в принципе разница не существенна, так что пойдет и так!

А время создания часом не перепутали с временем последней модификации? SearchRec.Time - содержит именно время последней модификации и вы сказали, что этот вариант вас устроил. Но в самом вопросе вы просили время создания, поэтому вам написали с SearchRec.FindData.ftCreationTime - временем создания. 
Если всё же нужно время последней модификации, то берите ftLastWriteTime вместо ftCreationTime (ещё есть ftLastAccessTime - время последнего доступа).

Добавлено через 1 минуту и 12 секунд
Цитата(Martisha @  1.12.2008,  15:56 Найти цитируемый пост)
выдается не то время

Хорошо бы тогда показать, какое время выдаётся, какое вы ожидаете увидеть и почему вы ожидаете увидеть это время (где вы его узнали).

Автор: Martisha 2.12.2008, 08:27
CodeMonkey, почему то выдается время одинаковое для всех текстовых фалов..но ведь такого же не может быть!

Цитата(CodeMonkey @  1.12.2008,  16:17 Найти цитируемый пост)
Но в самом вопросе вы просили время создания, поэтому вам написали с SearchRec.FindData.ftCreationTime - временем создания. 

наверное я ошиблась в формулировке, но то, что получилось меня устраивает..
Цитата(CodeMonkey @  1.12.2008,  16:17 Найти цитируемый пост)
Если всё же нужно время последней модификации, то берите ftLastWriteTime вместо ftCreationTime 

обязательно попробую)

Добавлено через 6 минут и 7 секунд
CodeMonkey
Цитата(CodeMonkey @  1.12.2008,  16:17 Найти цитируемый пост)
ftLastWriteTime

действительно подошло))  smile 

Автор: Chinese 2.12.2008, 22:37
Уважаемые форумчане помогите чайнику организовать поиск файлов на диске. У меня не получается не один промер который здесь указан. Программа ищет на корне диска, а в каталоги и подкаталоги заходить нехочет помогите чайнику. У меня цель написать программу которая бы отлавиливала расширение Tmp и удаляла его. Помогите пожалуйста.

Автор: THandle 2.12.2008, 22:44
Chinese, http://forum.vingrad.ru/sources/topic-205111.html

Ну и в DRKB примеры должны быть.

Автор: Chinese 2.12.2008, 23:50
В том то и дело что если ты говоришь *.* То поиск идёт везде, а если ставишь вместо звёздочек скажем  *.TXT то он ищет только накорню,  в каталоги и подкаталоги не глядит.

Автор: CodeMonkey 3.12.2008, 10:08
Цитата(Chinese @  2.12.2008,  23:50 Найти цитируемый пост)
в каталоги и подкаталоги не глядит

Ну разумеется: расширения-то у каталогов нет. Под такую маску они не подходят.

Автор: THandle 3.12.2008, 13:44
Chinese, вот что то типа такого, с проверкой на расширение. Только соответственно сделай вместо добавления в список удаление файла.
Код


procedure ListFilesInDirectory(Dir: string; const Ext: String; Strings: TStrings);
var
  rSearchRec: TSearchRec;
begin
  if ((Dir = '') or (not Assigned(Strings))) then
    Exit;
  Dir := IncludeTrailingPathDelimiter(Dir);
  if FindFirst(Dir + '*.*', faAnyFile, rSearchRec) = 0 then
    repeat
      if ((rSearchRec.Name <> '.') and (rSearchRec.Name <> '..')) then
        if (rSearchRec.Attr and faDirectory) <> 0 then
          ListFilesInDirectory(Dir + rSearchRec.Name, Ext, Strings)
        else
          if CompareText(ExtractFileExt(rSearchRec.Name), Ext) = 0 then
            Strings.Add(rSearchRec.Name);
    until FindNext(rSearchRec) <> 0;
  FindClose(rSearchRec);
end;

Автор: Chinese 5.12.2008, 20:53
Цитата

Chinese, вот что то типа такого, с проверкой на расширение. Только соответственно сделай вместо добавления в список удаление файла.код Pascal/Delphi

Я не понял, где здесь проверяется расширение. Пожалуйста обясните как его проверять. пробывал сравнивать rSearchRec.Name с *.tmp, но он ничего не выдавал. Помогите.

Автор: THandle 5.12.2008, 22:52
Цитата(Chinese @  5.12.2008,  20:53 Найти цитируемый пост)
Я не понял, где здесь проверяется расширение. 


Цитата(THandle @  3.12.2008,  13:44 Найти цитируемый пост)
if CompareText(ExtractFileExt(rSearchRec.Name), Ext) = 0 then


http://forum.vingrad.ru/faq/topic-212851.html

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