Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.14;
Скачать: CL | DM;

Вниз

Проблема в порядке найденных файлов   Найти похожие ветки 

 
electric ©   (2003-04-02 16:29) [0]

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


 
Palladin ©   (2003-04-02 16:34) [1]


> У меня возникла проблема в порядке найденных

У тебя возникла потребность в сортировке найденых файлов, проблемы здесь нет

Заноси найденые файлы и каталоги в TStringList и после занесения выполни YStringList.Sort;


 
electric ©   (2003-04-02 16:39) [2]

> Palladin © (02.04.03 16:34)

Я сначала тоже так думал, но сортировка происходит общая , а не в отдельности каждая папочка.


 
panov ©   (2003-04-02 16:43) [3]

Ну так по-отдельности сортируй каждую... В чем проблема-то?


 
electric ©   (2003-04-02 16:48) [4]

panov © (02.04.03 16:43)

Может подскажешь как это делать?
Я это и хочу услышать от Вас.


 
panov ©   (2003-04-02 16:52) [5]

Так ты бы хоть метод описал, которым получаешь список файлов,
мы же не ясновидящие...


 
Palladin ©   (2003-04-02 16:54) [6]


> Я это и хочу услышать от Вас.

что то не видел я этих слов в первом вопросе...


> а не в отдельности каждая папочка.

но ведь список файлов то ты получаешь для каждой отдельной папочки... кто тебе мешает создать TStringList для каждой отдельной папочки?


 
electric ©   (2003-04-02 16:57) [7]

>panov © (02.04.03 16:52)

Взял у Анатолия Подгорецкого

Как получить список файлов со всеми подкаталогами


procedure ScanDir(StartDir: string; Mask:string; List:TStrings);
var
SearchRec : TSearchRec;
begin
if Mask = "" then Mask := "*.*";
if StartDir[Length(StartDir)] <> "\" then StartDir := StartDir + "\";
if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
begin
repeat
Application.ProcessMessages;
if (SearchRec.Attr and faDirectory) <> faDirectory then
List.Add(StartDir + SearchRec.Name)
else if (SearchRec.Name <> "..") and (SearchRec.Name <> ".") then
begin
List.Add(StartDir + SearchRec.Name + "\");
ScanDir(StartDir + SearchRec.Name + "\",Mask,List);
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;

Пример вызова, параметры
1. имя папки
2. маска, по умолчанию *.*
3. хранилище для резульатат,
любой наследник от TString, например TStringList


procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Clear;
ScanDir("c:","",ListBox1.Items);
Label1.Caption := IntToStr(ListBox1.Items.Count);
end;


 
Anatoly Podgoretsky ©   (2003-04-02 16:57) [8]

Palladin © (02.04.03 16:54)
Не совсем так, это только если процедура получения имен построена должным образом, а если нет, то файлы в папке и вложенные папки идут в разброс.
Процедура должна быть двух уровневая
1. получение только файлов
2. получения папок и рекурсия


 
electric ©   (2003-04-02 17:01) [9]

Anatoly Podgoretsky © (02.04.03 16:57)

Анатолий, скажите же пажалуйста как это сделать.


 
Palladin ©   (2003-04-02 17:04) [10]


> Anatoly Podgoretsky © (02.04.03 16:57)

ну я на общий принцип намекнул.. думать то пусть он думает, что заносить а что нет...

да и представление вообщето здесь необзодимо древовидное...


 
electric ©   (2003-04-02 17:10) [11]

Palladin © (02.04.03 17:04)

Зачем мне намекать, эти намёки я сам давно понял, подскажите лучше как это осуществить. Неужели вы думаете , что я не пытался, что-то похимичить. Зря вы так думаете.


 
panov ©   (2003-04-02 17:13) [12]

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

procedure ScanDir(StartDir: string; Mask:string; List:TStrings);
var
SearchRec : TSearchRec;
tmpList: TStringList;
begin
tmpList := TStringList.Create;
try

if Mask = "" then Mask := "*.*";
if StartDir[Length(StartDir)] <> "\" then StartDir := StartDir + "\";
if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
begin
repeat
Application.ProcessMessages;
if (SearchRec.Attr and faDirectory) <> faDirectory then
tmpList.Add(StartDir + SearchRec.Name)
else if (SearchRec.Name <> "..") and (SearchRec.Name <> ".") then
begin
tmpList.Sort;
List.AddStrings(tmpList);
tmpList.Clear;

List.Add(StartDir + SearchRec.Name + "\");
ScanDir(StartDir + SearchRec.Name + "\",Mask,List);
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
finally
tmpList.Free;
end;


end;


 
electric ©   (2003-04-02 17:46) [13]

>panov © (02.04.03 17:13)

Такой намек больше нравится, но твой код не находит некоторые файлы :-(


 
Anatoly Podgoretsky ©   (2003-04-02 18:19) [14]

У меня на сайте есть компонент DirScan, можешь его взять за основу, писался давно, может не совсем оптимально.


 
Alexander Vasjuk   (2003-04-02 18:34) [15]

В порядке бреда:
Запусти внешний процесс "dir c:\ /s > dir.txt /oe", а потом считай из dir.txtготовенькое.



Страницы: 1 вся ветка

Текущий архив: 2003.04.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
3-44068
Инна
2003-03-24 17:11
2003.04.14
модификация записей и отражение изменений на экране


6-44288
and_1
2002-11-28 21:12
2003.04.14
Мастера нужна помощь ! ( комманды Msdos)


1-44220
race1
2003-04-01 17:48
2003.04.14
ttreenode


3-44011
Minivan
2003-03-25 08:13
2003.04.14
базы данных


6-44286
Arkady
2003-02-18 10:21
2003.04.14
Перехват Socket