Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
1-44199
odyssey
2003-04-01 16:57
2003.04.14
DateTimePicker


14-44392
quest1111
2003-03-27 10:03
2003.04.14
Акробатика в Unreal


14-44431
Alexandrius
2003-03-28 20:06
2003.04.14
Нужен бесплатный компонент для работы с Excel файлами


6-44289
_dron_
2003-02-20 11:59
2003.04.14
Проблема при повторном дозвоне, если линия занята


3-44043
jen_bond
2003-03-26 10:55
2003.04.14
EMF





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский