Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Вниз

Поиск с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.01 c
2-1153165789
Vivax
2006-07-17 23:49
2006.08.06
popupmenu


15-1152657553
Alx_
2006-07-12 02:39
2006.08.06
The security log on this system is full


2-1153131002
Квэнди
2006-07-17 14:10
2006.08.06
Преобразование даты в Posix формат


15-1152699816
QuickFinder
2006-07-12 14:23
2006.08.06
PostScript


15-1152273518
Колдун
2006-07-07 15:58
2006.08.06
Учебная деятельность





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