Delphi/С++.Програмный поиск папок/файлов
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Delphi/С++.Програмный поиск папок/файлов - 2008-02-06 22:34:07.200000
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Такое дело.Мне срочно нужно чтоб прога на компе искала папку(известно название).Уже искал в инете и щас ищу.Желательно на Delphi,но на крайняк сойдет и C++(*.dll мона склепать).Как файлы искать в папке знаю-FindFirst+FindNext.А на папки оно рабоает? И кроме как поиск файла везде тупой рекурсией,можно как-нить? Тем более,что лучше именно папку. Пожалуйста,просветите!
|
|
|
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
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-06 23:23:19.253333
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Отлично,спс,вот токо мне надо,чтоб прога сама(зная название) искала путь к папке.Эксплореровский поиск мне не нужен(+это нехилое,заметное окно).Есть ли удобное решение или токо хитрым алгоритмом?
|
|
|
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 …. // найденный файл является директорией
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 01:24:57.550000
|
|
|
alexbozhko
Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34
|
quote:
ORIGINAL: Genco Отлично,спс,вот токо мне надо,чтоб прога сама(зная название) искала путь к папке.Эксплореровский поиск мне не нужен(+это нехилое,заметное окно).Есть ли удобное решение или токо хитрым алгоритмом? Какой алгоритм? Открой help и прочти. В примере же четко все показано. И как работать с атрибутами в том числе.
|
|
|
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. Рекурсивный подход как раз таки правильный, т.к. его достаточно легко запрограммировать, да и код будет понятный. А то, что у тебя будет настолько большая глубина вложенных каталогов, что не хватит стека на вызовы - то это врядли (либо надо очень по-тупому закодировать).
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 15:05:19.690000
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Свойство есть про папку!! Отлично,уже что-то! Спасибо! Надо help нормальный мне поставить)).А рекурсия -самая правильная,но НЕ лучшая для мну идея: когда прога в начале работы "задумывается" на несколько минут,это вызывает сомнения и подозрения…хотя,надеюсь,сойдет.
|
|
|
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
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 17:15:56.773333
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Я знаю что это!)) Мне даже FindFirst (поле Attr) с головой хватит.И знаю что нормально…НО ПАЛЕВНО!!!! Про процессы-идея,подумаю.Мб FileExists хватит-примерно знаю же,где и чё искать.Но полюбому дело сдвинулось.Спасибо всем!
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-07 20:03:02.420000
|
|
|
alexbozhko
Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34
|
quote:
ORIGINAL: Genco Я знаю что это!)) Мне даже FindFirst (поле Attr) с головой хватит.И знаю что нормально…НО ПАЛЕВНО!!!! Про процессы-идея,подумаю.Мб FileExists хватит-примерно знаю же,где и чё искать.Но полюбому дело сдвинулось.Спасибо всем! Прошу прощения, а что именно ты ищешь-то? Моожет оно тупо в реестре записано?
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 01:42:47.233333
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Да не,я уже справился.Прога должна была кой-каую папку нарыть(вообще-то,чтоб скопировать) и я знал что там,помимо прочего,точно есть кой-какие файлы(*.cfg).В идеале хотелось чтоб она для этого на долго не "замирала". С реестром-не судьба,не к месту.Ну,вот я просто сделал,чтоб не везде искала(по диску),а только там,где почти наверняка папка и лежит,и ок.)
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 04:02:21.416666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
А чтобы наверняка - создаёшь поток с маленьким приоритетом, который тебе всё это дело и шуршит.
|
|
|
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; Работать не будет (тупой компилятор)
|
|
|
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 -дело на лад пошло.)
|
|
|
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() ) мы содержимое ветки условия проскакиваем. первоё что пришло в голову, это мат. Делфа обрабатывала в условии не результат возврящаемый функцией, а адрес точки входа (моё предположение) в неё. В С++ ведь такого нет, я и считал, что нет нигде.
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 20:09:40.240000
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Да,худо когда про тонкости забываешь,сам напарывался.))
|
|
|
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 < 5){...}
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-08 22:37:25.200000
|
|
|
tеstеr
Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
|
Но это код на Яве, но никак не на С++. А ваще интересный вариант. Я то про Delphi сказал. В ней без этого нельзя. А в Яве то можно.
|
|
|
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() ) мы содержимое ветки условия проскакиваем. первоё что пришло в голову, это мат. Делфа обрабатывала в условии не результат возврящаемый функцией, а адрес точки входа (моё предположение) в неё. Чё-т я не догоняю… Если твоя функция всегда возвращает тру, и из-за этого у тебя ошибки, то при чём тут компилятор? Он то как раз всё делает правильно. И при чём тут Делфи? Что-то я вообще мысли не уловил…
|
|
|
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<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; Работать не будет (тупой компилятор) А давайте, с этого места - отрежим и увековечим в палате :)
|
|
|
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-а нет,сидишь и думаешь-что ж не так.
|
|
|
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 - будет прекрасно работать
|
|
|
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++. Надо протестить. А то вдруг и вравду пургу гоню.
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-09 01:54:28.973333
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Я,честно говоря,не проверял,токо пояснил.(сам всегда пишу как надо) Мб и так пашет-не суть,но опять таки,имхо нагляднее писать "..)=true;"
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-09 20:04:36.583333
|
|
|
tеstеr
Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
|
А я нашел, тот код, в котором нужно принудительно сравнивать с true = это С++Builder. Нашел и проверил, спутал я эти два продукта от Borland, и запутал при этом доверчивых людей. Прошу прощения. Но доля истины в моих словах была :))))
|
|
|
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 очень красиво показал к чему приводит подобное недопонимание сути вещей. Т.н. "индийский код" - решаем чж то, что имеет простейшее решение.
|
|
|
RE: Delphi/С++.Програмный поиск папок/файлов - 2008-02-11 20:44:14.810000
|
|
|
Яски Хианто
Сообщений: 13
Оценки: 0
Присоединился: 2007-11-24 17:53:43.173333
|
Запускай функцию поиска папки в потоке, а ответ возвращай через SendMessage
|
|
|
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.
|
|
|
|
|