Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Delphi/С++.Програмный поиск папок/файлов

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Delphi/С++.Програмный поиск папок/файлов
Имя
Сообщение << Старые топики   Новые топики >>
Delphi/С++.Програмный поиск папок/файлов - 2008-02-06 22:34:07.200000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Такое дело.Мне срочно нужно чтоб прога на компе искала папку(известно название).Уже искал в инете и щас ищу.Желательно на Delphi,но на крайняк сойдет и C++(*.dll мона склепать).Как файлы искать в папке знаю-FindFirst+FindNext.А на папки оно рабоает? И кроме как поиск файла везде тупой рекурсией,можно как-нить? Тем более,что лучше именно папку. Пожалуйста,просветите!
Post #: 1
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-06 22:53:38.590000   
5_nix

Сообщений: 231
Оценки: 0
Присоединился: 2007-02-26 00:43:17.386666
http://www.delphisources.ru/pages/faq/base/find_file_dialog.html
Post #: 2
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-06 23:23:19.253333   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Отлично,спс,вот токо мне надо,чтоб прога сама(зная название) искала путь к папке.Эксплореровский поиск мне не нужен(+это нехилое,заметное окно).Есть ли удобное решение или токо хитрым алгоритмом?
Post #: 3
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 00:36:39.933333   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
У типа TSearchRec есть поле Attr, которое указывает на тип найденного файла (сравнивается через логическое И):
if ((sr.Attr and faDirectory) <> 0) then …. // найденный файл является директорией
Post #: 4
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 01:24:57.550000   
alexbozhko

Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34

quote:

ORIGINAL: Genco

 Отлично,спс,вот токо мне надо,чтоб прога сама(зная название) искала путь к папке.Эксплореровский поиск мне не нужен(+это нехилое,заметное окно).Есть ли удобное решение или токо хитрым алгоритмом?

Какой алгоритм?
Открой help и прочти. В примере же четко все показано. И как работать с атрибутами в том числе.
Post #: 5
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 03:35:17.900000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Курим МСДН. FindFirstFile / FindFirstFileEx. Берём структуру WIN32_FIND_DATA, смотрим возможные флаги в поле dwFileAttributes. А именно FILE_ATTRIBUTE_DIRECTORY. Думаю доступно объяснил ;). Не забываем в конце поиска вызывать FindClose. И ставим плюсики за хорошие советы.

P.S. Рекурсивный подход как раз таки правильный, т.к. его достаточно легко запрограммировать, да и код будет понятный. А то, что у тебя будет настолько большая глубина вложенных каталогов, что не хватит стека на вызовы - то это врядли (либо надо очень по-тупому закодировать).
Post #: 6
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 15:05:19.690000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Свойство есть про папку!! Отлично,уже что-то! Спасибо! Надо help нормальный мне поставить)).А рекурсия -самая правильная,но НЕ лучшая для мну идея: когда прога в начале работы "задумывается" на несколько минут,это вызывает сомнения и подозрения…хотя,надеюсь,сойдет.
Post #: 7
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 16:53:31.633333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Это не свойство ;). Это поле структуры. И один из битов у него может быть установлен. Т.е. если "WIN32_FIND_DATA(m_search).dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY" then… рекурсивный вызов.

А насчёт того, что "долго думает" - это нормально. Зависит от того, сколько файлов перебирает программа. Если бы у тебя было переполнение стека - то кинуло бы эррор, а не просто висела. А если хочешь, чтобы во время поиска твоя форма "не подвисала" - делай поиск в отдельном потоке. Кури CreateThread и WaitForSingleObject. Кстати, без рекурсии твоя прота тоже будет "задумываться". Это не от алгоритма зависит.

Если нет проблемм с инетом - юзай онлайновый msdn.microsoft.com
Post #: 8
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 17:15:56.773333   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Я знаю что это!)) Мне даже FindFirst (поле Attr) с головой хватит.И знаю что нормально…НО ПАЛЕВНО!!!!
Про процессы-идея,подумаю.Мб FileExists хватит-примерно знаю же,где и чё искать.Но полюбому дело сдвинулось.Спасибо всем!
Post #: 9
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 20:03:02.420000   
alexbozhko

Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34

quote:

ORIGINAL: Genco

 Я знаю что это!)) Мне даже FindFirst (поле Attr) с головой хватит.И знаю что нормально…НО ПАЛЕВНО!!!!
Про процессы-идея,подумаю.Мб FileExists хватит-примерно знаю же,где и чё искать.Но полюбому дело сдвинулось.Спасибо всем!

Прошу прощения, а что именно ты ищешь-то?
Моожет оно тупо в реестре записано?
Post #: 10
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 01:42:47.233333   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Да не,я уже справился.Прога должна была кой-каую папку нарыть(вообще-то,чтоб скопировать) и я знал что там,помимо прочего,точно есть кой-какие файлы(*.cfg).В идеале хотелось чтоб она для этого на долго не "замирала". С реестром-не судьба,не к месту.Ну,вот я просто сделал,чтоб не везде искала(по диску),а только там,где почти наверняка папка и лежит,и ок.)
Post #: 11
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 04:02:21.416666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
А чтобы наверняка - создаёшь поток с маленьким приоритетом, который тебе всё это дело и шуршит.
Post #: 12
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 19:19:31.390000   
tеstеr

Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
Запись из MSDN:

Declared in WinBase.h; include Windows.h.


BOOL WINAPI SetCurrentDirectory(
__in LPCTSTR lpPathName
);


чё это значит:

значит это, что в delphi или C++ подключаешь файлики WinBase и Windows
В Delphi : uses WinBase, Windows, …;
В С++:
#include<WinBase.h>
#include<Windows.h>

А потом вызывай SetCurrentDirectory("C:\Тестовая папка");
Если вернёт true, то приступай к вызову FindFirst+FindNext

В Delphi выполняй проверку так:
if SetCurrentDirectory("C:\Тестовая папка") = true then
begin

end;

А C++ умнее, там можно так:
if(SetCurrentDirectory("C:\\Тестовая папка"))
{
….
}

Заметь, что в Delphi нужно принудительно сравнивать результат с true (это 1)
напишешь так:
if SetCurrentDirectory("C:\Тестовая папка") then
begin

end;
Работать не будет (тупой компилятор)
Post #: 13
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 19:44:13.580000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 
quote:

Работать не будет (тупой компилятор)
Не тупой,а точный и строгий.Мля…поясняю:оно и без SetCurrentDirectory нормально делается,FindFirst+FindNext хватает(если вспомнить про attr=faDirectory),токо всё одно это рекурсия или полюбому перебор большой.Времени было мало,чтоб с процессами разбираться,а время "на подумать" проге не давалось.Ну,вот как указали мне на поле attr -дело на лад пошло.)
Post #: 14
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 20:03:16.050000   
tеstеr

Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
я вопрос понял не правильно, мы знаем только "Тестовая папка", то что она расположена так : "C:\Temp\MyProject\Test\Тестовая папка" мы не знаем. Наша задача пробраться по этому пути ("C:\Temp\MyProject\Test\") и достичь желаемого ("Тестовая папка").

А на счёт компилятора:
долго не понимал чё прога не пашет, уже всё перепробовал. Залез в глубокую отладку и обнаружил, что в функции (назовём её TestFunc) выполняется return true, а при проверке if( TestFunc() ) мы содержимое ветки условия проскакиваем. первоё что пришло в голову, это мат.

Делфа обрабатывала в условии не результат возврящаемый функцией, а адрес точки входа (моё предположение) в неё.

В С++ ведь такого нет, я и считал, что нет нигде.
Post #: 15
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 20:09:40.240000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Да,худо когда про тонкости забываешь,сам напарывался.)) 
Post #: 16
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 22:15:13.386666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: tеstеr

Заметь, что в Delphi нужно принудительно сравнивать результат с true (это 1)

вспоминается боян:
Какой самый извращенный способ проверить в условии if () булевскую переменную ? bool b; b = false; if (b == true){...} Это децкий лепет ИТАК, ПЕРВОЕ МЕСТО Знакомый говорит что нашел только что в коде: if (b.ToString().length &lt; 5){...}
Post #: 17
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 22:37:25.200000   
tеstеr

Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
Но это код на Яве, но никак не на С++. А ваще интересный вариант.

Я то про Delphi сказал. В ней без этого нельзя. А в Яве то можно.
Post #: 18
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 23:17:15.903333   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666

quote:

ORIGINAL: tеstеr

А на счёт компилятора:
долго не понимал чё прога не пашет, уже всё перепробовал. Залез в глубокую отладку и обнаружил, что в функции (назовём её TestFunc) выполняется return true, а при проверке if( TestFunc() ) мы содержимое ветки условия проскакиваем. первоё что пришло в голову, это мат.

Делфа обрабатывала в условии не результат возврящаемый функцией, а адрес точки входа (моё предположение) в неё.

Чё-т я не догоняю… Если твоя функция всегда возвращает тру, и из-за этого у тебя ошибки, то при чём тут компилятор? Он то как раз всё делает правильно. И при чём тут Делфи? Что-то я вообще мысли не уловил…
Post #: 19
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 23:30:59.053333   
alexbozhko

Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34

quote:

ORIGINAL: tеstеr

Запись из MSDN:

Declared in WinBase.h; include Windows.h.


BOOL WINAPI SetCurrentDirectory(
__in LPCTSTR lpPathName
);


чё это значит:

значит это, что в delphi или C++ подключаешь файлики WinBase и Windows
В Delphi : uses WinBase, Windows, …;
В С++:
#include&lt;WinBase.h&gt;
#include&lt;Windows.h&gt;

А потом вызывай SetCurrentDirectory("C:\Тестовая папка");
Если вернёт true, то приступай к вызову FindFirst+FindNext

В Delphi выполняй проверку так:
if SetCurrentDirectory("C:\Тестовая папка") = true then
begin

end;

А C++ умнее, там можно так:
if(SetCurrentDirectory("C:\\Тестовая папка"))
{
….
}

Заметь, что в Delphi нужно принудительно сравнивать результат с true (это 1)
напишешь так:
if SetCurrentDirectory("C:\Тестовая папка") then
begin

end;
Работать не будет (тупой компилятор)

А давайте, с этого места - отрежим и увековечим в палате :)
Post #: 20
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 23:59:43.043333   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
2 rgo : :D вот улыбнуло,пасиба.ппц как жизненно)
2 tester : как бы там ни было,но мну радует прописывать сравнение с "true" и "false". Потому как это,имхо,очевиднее и нагляднее,чем помнить,что 1=правда,0=ложь(точнее не 1,а любое число)
2 kreol: типо,фишка в том,что если любитель С++ по привычке не пишет в Delphi=true,то условие (if) обычно не проверяется,if-а нет,сидишь и думаешь-что ж не так.
Post #: 21
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-09 00:03:52.046666   
alexbozhko

Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34

quote:

ORIGINAL: Genco

2 rgo : :D вот улыбнуло,пасиба.ппц как жизненно)
2 tester : как бы там ни было,но мну радует прописывать сравнение с "true" и "false". Потому как это,имхо,очевиднее и нагляднее,чем помнить,что 1=правда,0=ложь(точнее не 1,а любое число)
2 kreol: типо,фишка в том,что если любитель С++ по привычке не пишет в Delphi=true,то условие (if) обычно не проверяется,if-а нет,сидишь и думаешь-что ж не так.

Да, вот это вот, мягко говоря, ничего общего с объективной реальностью не имеет.
В Delphi выполняй проверку так: if SetCurrentDirectory("C:\Тестовая папка") = true then begin ... end; if SetCurrentDirectory("C:\Тестовая папка") then - будет прекрасно работать
Post #: 22
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-09 00:54:01.616666   
tеstеr

Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
А это может быть. Но я помню что баг этот был, если не в Borland Delphi, то в Borland C++. Надо протестить. А то вдруг и вравду пургу гоню.
Post #: 23
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-09 01:54:28.973333   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Я,честно говоря,не проверял,токо пояснил.(сам всегда пишу как надо) Мб и так пашет-не суть,но опять таки,имхо нагляднее писать "..)=true;"
Post #: 24
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-09 20:04:36.583333   
tеstеr

Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
А я нашел, тот код, в котором нужно принудительно сравнивать с true = это С++Builder. Нашел и проверил, спутал я эти два продукта от Borland, и запутал при этом доверчивых людей. Прошу прощения. Но доля истины в моих словах была :))))
Post #: 25
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-10 11:52:16.970000   
alexbozhko

Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34

quote:

ORIGINAL: tеstеr

А я нашел, тот код, в котором нужно принудительно сравнивать с true = это С++Builder. Нашел и проверил, спутал я эти два продукта от Borland, и запутал при этом доверчивых людей. Прошу прощения. Но доля истины в моих словах была :))))

:)
Я не знаю как в Билдере, но в Паскале true и 1 не приводятся автоматически. Это разные типы. Но в условие оператора if ты можешь поставить булевскую переменную (иначе, по логике вещей, и быть не может). Поэтому, ИМХО, единственный вопрос с которым ты не разобрался - приведение типов.
А rgo очень красиво показал к чему приводит подобное недопонимание сути вещей. Т.н. "индийский код" - решаем чж то, что имеет простейшее решение.
Post #: 26
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-11 20:44:14.810000   
Яски Хианто

Сообщений: 13
Оценки: 0
Присоединился: 2007-11-24 17:53:43.173333
Запускай функцию поиска папки в потоке, а ответ возвращай через SendMessage
Post #: 27
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-13 15:20:14.200000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Читаем мсдн.
quote:


The SetCurrentDirectory function changes the current directory for the current process.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.


А в C++ (как и в Cpp Builder-е) nonzero - это всегда true.
Post #: 28
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Delphi/С++.Програмный поиск папок/файлов







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.