Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 16.11.2009, 21:19   #21
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

DarkEvil
ну это совсем другое дело.
Только всё равно одна маленькая недоработочка осталась... Дело в том, что FindFirst ищет по маске. а в ней много чего допускается, 1) можно задавать не только расширение. 2) и в расширении можно задавать подстановочные знаки (? (один любой знак) и * - любое количество любых знаков..
вот так можно найти все файлы, имеющие расширение из двух символов *.??
или маска T*.AVI - найдёт все файлы AVI, начинающиеся на T...

в Вашем же случае MASK - это исключительно расширение!

поэтому лучше делать так, как я сразу сказал - ДВА цикла перебора файлов, один - по маске, второй - по подкаталогам.
Serge_Bliznykov вне форума
Старый 16.11.2009, 21:37   #22
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
DarkEvil
ну это совсем другое дело.
Только всё равно одна маленькая недоработочка осталась... Дело в том, что FindFirst ищет по маске. а в ней много чего допускается, 1) можно задавать не только расширение. 2) и в расширении можно задавать подстановочные знаки (? (один любой знак) и * - любое количество любых знаков..
вот так можно найти все файлы, имеющие расширение из двух символов *.??
или маска T*.AVI - найдёт все файлы AVI, начинающиеся на T...

в Вашем же случае MASK - это исключительно расширение!

поэтому лучше делать так, как я сразу сказал - ДВА цикла перебора файлов, один - по маске, второй - по подкаталогам.
Ну я в таком случае зделал бы так:
Код:
 if ExtractFileExt(SearchRec.Name) = Mask then
Заменил бы на:
Код:
if MatchesMask(ExtractFileName(SearchRec.Name), Mask) then
добавив соотвествующий модуль Masks
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!

Последний раз редактировалось DarkEvil; 16.11.2009 в 23:41.
DarkEvil вне форума
Старый 16.11.2009, 23:17   #23
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот. согласен! так даже лучше!
Serge_Bliznykov вне форума
Старый 16.11.2009, 23:27   #24
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ох ребятушки-ребятушки.
Там где непонятки с faDirectory делается это так:

Код:
if ((SearchRec.Attr and faDirectory) = faDirectory) then
// папку найшли
else
// файл нашли
Нельзя делать <> 0, т.к. будь там какой то еще флаг, и faDirectory не прямо указывает 1 бит, тогда попали бы Вы

p.s. почему пишу ? было в практике, долго искал причину... после пишу только так, либо четкий 0, либо четкое равенство. Хотя щас в С++, пишу так (attr & FILE_ATTRIBUTE_DIRECTORY) типа того

и к слову, еще кое-что заметил
Код:
 if StartDir[Length(StartDir)] <> '\'
опасно такие вещи писать а если ситуация, ну вот вдруг, что Length(StartDir) вернет 0 т.е. получаем элемент 0 (1й элемент) из нулевого масива.. ай-ай лучше так
Код:
 if copy(StartDir, 1, 1) <> '\'
ну на счет copy не помню уже... дельфи забыл но конечно же лучше вначале функции проверять длину StartDir.

Последний раз редактировалось BOBAH13; 16.11.2009 в 23:30.
BOBAH13 вне форума
Старый 16.11.2009, 23:38   #25
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
Смех

на втрой упрек, если точнее то самое лучшее будет
Код:
IncludeTrailingPathDelimiter(StartDir);
на первый же, работает, что бы что-то где-то несработало, то такого небыло ))) Но Ваше замечания принято )))
а идея автора, была поправить его код, а не полностью переработать, оптимизировать
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!

Последний раз редактировалось DarkEvil; 16.11.2009 в 23:42.
DarkEvil вне форума
Старый 16.11.2009, 23:50   #26
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
if ((SearchRec.Attr and faDirectory) = faDirectory) then
так, конечно, более красиво.

но,
Цитата:
Нельзя делать <> 0, т.к. будь там какой то еще флаг, и faDirectory не прямо указывает 1 бит, тогда попали бы Вы
c этим категорически не согласен.
(... and faDirectory )<>0
Так тоже будет работать чётко и без ошибок.
Смотрите, накладываем битовую маску через AND
и тут уже всёго два варианта - либо в нужной позиции была единичка (т.е. был аттрибут faDirectory) и тогда получим число не равное нулю.
Либо, если не было аттрибута faDirectory, в нужной битовой позиции был 0 и And faDirectory вёрнёт число НОЛЬ. всё. третьего не дано!

___________________________________ _________
цитирую:
Цитата:
Сообщение от (c) JEDI
Код:
function IncludeTrailingPathDelimiter(const APath: string): string;
begin
  if (Length(APath) > 0) and (APath[Length(APath)] <> '\') then
    Result := APath + '\'
  else
    Result := APath;
end;
Цитата:
Сообщение от sysutils
Код:
function IsPathDelimiter(const S: string; Index: Integer): Boolean;
begin
  Result := (Index > 0) and (Index <= Length(S)) and (S[Index] = '\')
    and (ByteType(S, Index) = mbSingleByte);
end;

function IncludeTrailingBackslash(const S: string): string;
begin
  Result := S;
  if not IsPathDelimiter(Result, Length(Result)) then Result := Result + '\';
end;
это я к тому, что в первоначальный код нужно было добавить проверку длины строки и всё... хотя, конечно, использование системной функции это, безусловно, правильное решение.

Последний раз редактировалось Serge_Bliznykov; 17.11.2009 в 00:00.
Serge_Bliznykov вне форума
Старый 16.11.2009, 23:58   #27
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию



мдя, но как бы красивей использовать готовую функцию, и читать код через
пол года будет все также удобно
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума
Старый 19.11.2009, 05:59   #28
MixanMM
Форумчанин
 
Регистрация: 09.06.2009
Сообщений: 151
По умолчанию

Ну кли тут такая тема, воопщем у меня вопрос в довесок к этому всему, как сделать что бы при нахлждении файла *rep_01.* и файла *rep_015.* он их раскидывал по разным папкам?
MixanMM вне форума
Старый 19.11.2009, 08:34   #29
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

Цитата:
Сообщение от MixanMM Посмотреть сообщение
как сделать что бы при нахлждении файла *rep_01.* и файла *rep_015.* он их раскидывал по разным папкам?
можно через стандартную функцию RenameFile
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума
Старый 19.11.2009, 11:30   #30
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Одна тема - один вопрос.
Развели флуд.
Закрыто.
mihali4 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск spree Microsoft Office Excel 22 16.11.2009 15:08
Поиск-? Evgenii БД в Delphi 8 31.07.2009 16:27
поиск - ? Evgenii БД в Delphi 11 22.07.2009 19:41
поиск artemavd БД в Delphi 3 21.10.2008 17:39
Поиск Andr Microsoft Office Excel 2 18.07.2007 11:49