Форум: "Начинающим";
Текущий архив: 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