Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.06;
Скачать: CL | DM;

Вниз

Поиск с FindFirst и FindNext   Найти похожие ветки 

 
MixAnOL   (2006-07-19 13:24) [0]

Здарова всем!

Использую поиск файлов используя сабж. Алгоритм взят из справки борланда.
При этом возникают интересные моменты, например, когда я пытаюсь искать по маске "F*", то находятся даже файлы не имеющие в имени буквы F.
Долго не мог понять и обнаружил, что оказывается в записи TSearchRec есть поле-запись FindData, где в поле cAlternateFileName указывается усеченное 8-ми значное имя файла. Дык вот его значение и подходит под маску "F*".

Странность в том, что имя файла даже может быть полностью из русских букв и не содержать буквы F.

Как побороть?


 
Reindeer Moss Eater ©   (2006-07-19 14:04) [1]

Никак. Это оптический обман.


 
Юрий Зотов ©   (2006-07-19 14:18) [2]

> MixAnOL   (19.07.06 13:24)

Странные вещи Вы рассказываете. Логичнее предположить ошибку в коде - но где он?


 
MixAnOL   (2006-07-19 14:26) [3]


 if FindFirst(SearchPath+"\"+SearchMask,faDirectory,F)=0 then goto f1;
 while (FindNext(F)=0) do
   begin
f1:
     if (F.Name<>".")and(F.Name<>"..") then
        FindedDirs.Add(F.Name);
   end;
 FindClose(F);


Указываю SearchMask="F*"


 
Reindeer Moss Eater ©   (2006-07-19 14:34) [4]

Never jump into a loop or other structured statement, since this can have unpredictable effects.


 
Johnmen ©   (2006-07-19 14:35) [5]

Наиинтереснейшее гоуту! :)))


 
Юрий Зотов ©   (2006-07-19 14:37) [6]

Вызывает подозрение вхождение в тело цикла минуя его заголовок. Попробуйте так (а маску задавайте F*.*):

if FindFirst(IncludeTrailingBackSlash(SearchPath) + SearchMask, faDirectory, F) = 0 then
try
 repeat
   if (F.Name <> ".") and (F.Name <> "..") then
       FindedDirs.Add(F.Name)
 until
   FindNext(F) <> 0
finally
 FindClose(F)
end;

Еще можно искать по маске *.*, а фильтровать через MatchesMask.


 
Palladin ©   (2006-07-19 14:45) [7]

а мне понравилось столь нестандартное решение :)


 
Юрий Зотов ©   (2006-07-19 14:46) [8]

> Palladin ©   (19.07.06 14:45) [7]

Для старых языков (Fortran, PL/1) - совершенно стандартное.


 
StriderMan ©   (2006-07-19 14:50) [9]


> Для старых языков (Fortran, PL/1) - совершенно стандартное

неужели goto в тело цикла корректно работает? ... впрочем почему бы нет (кроме for)


 
Юрий Зотов ©   (2006-07-19 14:54) [10]

> StriderMan ©   (19.07.06 14:50) [9]

Угу. Если корректно написано, то корректно и работает (даже и для for). По крайней мере, в PL/1.


 
MixAnOL   (2006-07-19 14:58) [11]


if FindFirst(IncludeTrailingBackSlash(SearchPath) + SearchMask, faDirectory, F) = 0 then
try
repeat
  if (F.Name <> ".") and (F.Name <> "..") then
      FindedDirs.Add(F.Name)
until
  FindNext(F) <> 0
finally
FindClose(F)
end;

результат тот же...


 
MixAnOL   (2006-07-19 15:09) [12]

к примеру, TSearchRec для директории с именем ЖАСМИН в поле cAlternateFileName содержит "F251~1"...
вот и находится эта директория по маске "F*"


 
Плохиш ©   (2006-07-19 15:26) [13]


> Palladin ©   (19.07.06 14:45) [7]
> а мне понравилось столь нестандартное решение :)

А мне больше само условие понравилось "Если FindFirst вернёт не 0, то выполни FindNext!" :-)))


 
Dimka Maslov ©   (2006-07-19 15:26) [14]

Надо производить поиск по маске *.* (поиск всех фалов) затем, воспользовавшись функцие MatchesMask из модуля Masks проверять имя файла на соответсвие маске.


 
MixAnOL   (2006-07-19 15:35) [15]


> Надо производить поиск по маске *.* (поиск всех фалов) затем,
>  воспользовавшись функцие MatchesMask из модуля Masks проверять
> имя файла на соответсвие маске.

Помогло!

Но неясность с cAlternateFileName  осталась..


 
Dimka Maslov ©   (2006-07-19 17:28) [16]

MixAnOL   (19.07.06 15:35) [15]
cAlternateFileName - это т.н. короткое имя файла, совместимое со старыми FAT. В FAT32 оно первыми шестью символами совпадает с длинным именем, в NTFS оно может быть любым. Проблема возникает от того, что FindFirst и FindNext работают через соответствующие устаревшие функции Windows, которые используют при писке по маске то самое короткое имя файла. Если бы они работали через ShellAPI которым, как и нам, уже всё равно, какое у файла короткое имя, то этой проблемы не возникало бы.


 
MixAnOL   (2006-07-19 17:38) [17]


> Dimka Maslov

спасибо


 
Игорь Шевченко ©   (2006-07-19 17:52) [18]

"The FindFirstFile function opens a search handle and returns information about the first file with a name that matches that the specified pattern. The search includes the long and short file names"

Об чем честно написано в документации.


 
MixAnOL   (2006-07-21 13:59) [19]


> The search includes the long and short file names


Это понятно, но почему cAlternateFileName  вообще никак не сходится с полным именем файла?



Страницы: 1 вся ветка

Текущий архив: 2006.08.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.042 c
3-1148922065
alpha5
2006-05-29 21:01
2006.08.06
Странная ошибка


2-1152785917
Layner
2006-07-13 14:18
2006.08.06
Как восстановить программу зная ее THandle, из другой программы?


15-1152692547
DevilDevil
2006-07-12 12:22
2006.08.06
Быстрая компиляция Builder-a


15-1152088865
Zvrb
2006-07-05 12:41
2006.08.06
Преобразования десятичного числа в шестнадцатиричное в Excel 2003


15-1152166118
novill
2006-07-06 10:08
2006.08.06
Что с rsdn.ru?