Главная страница
    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.48 MB
Время: 0.008 c
1-44181
Антон
2003-04-03 18:37
2003.04.14
освобождение памяти


9-43982
Извращенец
2002-11-12 17:37
2003.04.14
как рисовать...


1-44273
Serega
2003-04-02 16:16
2003.04.14
Извлечь avi-шку из res-файла, включенного в exe-шник.


9-43978
Dankin
2002-11-12 01:42
2003.04.14
Как создать dll с картинками.


14-44383
Johnmen
2003-03-25 12:16
2003.04.14
Какой я плохой/хороший человек





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский