C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ФАЙЛЫ и ДИРЕКТОРИИ, Имя последнего созданного файла
Aptem
Отправлено: 25.07.2003, 14:21


Не зарегистрирован







Помогите, пожалуйста !!!

Вот есть у меня директория ( например: MyDocuments ).
В этой директории еще куча всяких поддиректорий.
В каждой этой поддиректории находятся файлы с одним и тем же именем. Мне нужно получить полное имя ( полный путь ) последнего созданного файла в директории MyDocuments.

Заранне благодарю за внимание.
Георгий
Отправлено: 25.07.2003, 18:06


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Делай рекурсивный поиск по всем этим директориям и смотри дату создания файла. результаты сведи в табличку
---дата создания---полный путь---
в которой сделай поиск максимума по дате — вот и получишь полное имя файла
Young Coder
Отправлено: 25.07.2003, 21:07


Дежурный стрелочник

Группа: Участник
Сообщений: 34



Не..
насколько я понял, Артем как раз интересуется как ему программно заглянять во все под под под директории... или я ошибаюсь?
Admin
Отправлено: 25.07.2003, 22:00


Владимир

Группа: Администратор
Сообщений: 1190



Ну правильно, Георгий и ответил:

QUOTE

Делай рекурсивный поиск по всем этим директориям


Вот он и заглянет во все под-под-под директории.
А пример поиска всех файлов на форуме я видел,
там и надо-то не так много переделать.
Aptem
Отправлено: 26.07.2003, 02:05


Мастер участка

Группа: Участник
Сообщений: 349



QUOTE (Young Coder @ 25/07/2003, 22:09)
Не..
насколько я понял, Артем как раз интересуется как ему программно заглянять во все под под под директории... или я ошибаюсь?

Да, да... Именно так.
Admin
Отправлено: 26.07.2003, 17:06


Владимир

Группа: Администратор
Сообщений: 1190



Попробуйте так:
(бросьте на форму 1 Button, 2 Label, 2 ListBox,
вставьте в Unit1.h описание функции
void FindDir(AnsiString sDir);

CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <FileCtrl.hpp>
#include <FileUtil.hpp>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Dir="c:";
ListBox1->Items->Clear(); ListBox2->Items->Clear();

if(SelectDirectory("Поиск файла","",Dir)){
Label1->Caption = "Начинаем в "+Dir;
FindDir(Dir);
}

int nmax = 0;
TDateTime mDT = StrToDateTime(ListBox2->Items->Strings[0]);
for(int i=0; i<ListBox2->Items->Count; i++){
TDateTime DT = StrToDateTime(ListBox2->Items->Strings[i]);
if(DT > mDT) { mDT = DT; nmax = i; }
}

Label2->Caption =
ListBox1->Items->Strings[nmax]+" — "+DateTimeToStr(mDT);
}
//---------------------------------------------------------------------------

void TForm1::FindDir(AnsiString sDir)
{
AnsiString mDir = sDir;
TSearchRec sr;
if (FindFirst(mDir+"\\*.*", faAnyFile, sr) == 0)
{
do
{
if(sr.Attr != faDirectory && sr.Name != "." && sr.Name != "..")
{
ListBox1->Items->Add(mDir+"\\"+sr.Name);
ListBox2->Items->Add(FileDateTime(mDir+"\\"+sr.Name));
} else
if(sr.Attr == faDirectory && sr.Name != "." && sr.Name != ".."){
FindDir(mDir+"\\"+sr.Name);
}
} while (FindNext(sr) == 0);
FindClose(sr);
}

}


Вроде работает, наверняка можно код и сократить и улучшить,
разобраться я думаю несложно.

Естественно, если все файлы не нужны — загонять все их и их даты
в ListBox-ы не нужно, они лишь для наглядности примера,
сразу сравнивайте даты (в FindDir) и оставляйте тот, который нужен.

Тогда и код сократиться и ListBox-ы и Label2 не понадобяться.
Например так:

CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <FileCtrl.hpp>
#include <FileUtil.hpp>

AnsiString  fFile;
TDateTime  fDT;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   AnsiString Dir;
   if(SelectDirectory("Найти файл","",Dir)){
      FindDir(Dir);
      }

   Label1->Caption = fFile + " — " + DateTimeToStr(fDT);
}
//---------------------------------------------------------------------------

void TForm1::FindDir(AnsiString sDir)
{
 AnsiString mDir = sDir;
 TSearchRec sr;
 if (FindFirst(mDir+"\\*.*", faAnyFile, sr) == 0)
 {
   do
   {
     if(sr.Attr != faDirectory && sr.Name != "." && sr.Name != "..")
     {
       if(FileDateTime(mDir+"\\"+sr.Name) >= fDT)
          {
            fFile = mDir+"\\"+sr.Name;
            fDT   = FileDateTime(mDir+"\\"+sr.Name);
          }
     } else
    if(sr.Attr == faDirectory && sr.Name != "." && sr.Name != ".."){
       FindDir(mDir+"\\"+sr.Name);
       }
   } while (FindNext(sr) == 0);
   FindClose(sr);
 }
}



Отредактировано Admin — 26/07/2003, 18:21

Вернуться в Вопросы программирования в C++Builder