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