W�a�ciwie to nigdy na to nie zwraca�em uwagi, ale pojawi� sie ciekawy
problem. Ot� wyszukiwanie plik�w (FindFirst...) oszukuje przy
wyszukiwaniu plik�w z d�ugim rozszerzeniem.
Mam takie 4 pliki:
1. c:\temp\test1.tx
2. c:\temp\test2.txt
3. c:\temp\test3.txtA
4. c:\temp\test3.txtB
FindFirst('c:\temp\*.*', ...
zwr�ci wszystkie pliki
FindFirst('c:\temp\*.tx', ...
zwr�ci #1
FindFirst('c:\temp\*.txt', ...
zwr�ci #2, #3 i #4 !!!
FindFirst('c:\temp\*.txtA', ...
zwr�ci #3
FindFirst('c:\temp\*.txtB', ...
zwr�ci #4
D2007, Vista i XP (oba 32bit)
O czymďż˝ nie wiem czy ten typ tak ma?
Da sie co� poczarowa� �eby przy wyszukiwaniu *.txt znajdywa� tylko te z
3 znakowym rozszerzeniem TXT? Skoro funkcja szukaj�ca przyjmuje maske
pliku to by�o by fajnie jakby to jeszcze dzia�a�o.
--
Pozdrawiam
dziobu
xyzyk.pl
To prawda, tez to zaobserwowalem na XP 32bit.
--
GAD Zombie
http://gad.art.pl/ (a email dosc podobny ;))
--
pzdr
RyAn
B��d Windows, czy te� dzia�anie niezgodne z oczekiwanym
Mo�na filtrowa� samemu u�ywaj�c funkcji kt�r� kiedy� na tej grupie poda�
Wojciech Spook Sura:
function StringMatchesMask(S, mask: string; CaseSensitive:
Boolean = false): Boolean;
function InternalStringMatchesMask(PS, PMask : PChar) : boolean;
begin
while PMask^<>#0 do
begin
// Trzy mo�liwo�ci:
case PMask^ of
'?' : begin
// Znak zapytania zast�puje dok�adnie jeden znak.
if PS^=#0 then
begin
// Osi�gni�to koniec ci�gu znak�w - brakuje znaku
// pasuj�cego do znaku zapytania - czyli ci�g
// nie pasuje do maski
result:=false;
exit
end;
inc(PMask);
inc(PS);
end;
'*' : begin
// Przy gwiazdce - zast�puj�cej dowoln� seri� zera lub
wi�cej
// znak�w - sprawa komplikuje si�: nie mo�emy
u�y�strategii
// zach�annej, bo funkcja powie, �e 'adas' nie pasuje do
'*as'.
// Dlatego dla ka�dego potencjalnego trafienia trzeba
b�dzie
// sprawdzi�, czy reszta ci�gu i maski do siebie pasuj�.
// Najpierw sprawdzamy prosty warunek:
inc(PMask);
if PMask^=#0 then
begin
// Gwiazdka na ko�cu wyra�enia - akceptujemy
wszystko,jak
// leci.
result:=true;
exit
end;
// Teraz PMask znajduje siďż˝ na pierwszym znaku za
gwiazdkďż˝.
while (PS^<>#0) do
begin
// Teraz mamy dwie mo�liwo�ci.
// 1. PMask nie jest wildcardem i nie pasuje do
ci�gu
// na tej pozycji. W tej sytuacji inkrementujemy
ci�g.
// Potocznie: "gwiazdka zjada ten znak".
if not(PMask^ in ['?','*']) and (PMask^<>PS^) then
begin
inc(PS);
if PS^=#0 then
begin
// Osi�gn�li�my koniec ci�gu znak�w, ale nie
// uda�o si� znale�� pasuj�cego znaku, czyli
// ci�g nie pasuje do wzorca.
result:=false;
exit
end;
end else
// 2. PMask pasuje do ci�gu na tej pozycji lub
// jest wildcardem. Wtedy je�li rekurencyjne
wywo�anie
// zwr�ci true - ko�czymy dzia�anie z rezultatem
true.
// W przeciwnym wypadku inkrementujemy ci�g.
begin
if InternalStringMatchesMask(PS, PMask) then
begin
result:=true;
exit
end else
begin
inc(PS);
if PS^=#0 then
begin
// Analogicznie, jak powy�ej
result:=false;
exit
end;
end;
end;
end;
// Je�eli do tego miejsca nie uda�o si� znale�� pasuj�cej
// cz�ci wzorca, oznacza to, �e ci�g nie pasuje do
wzorca.
result:=false;
exit
end;
else begin
// Na koniec najprostsze: badany znak maski nie jest
// wildcardem. Je�li pasuje do ci�gu, to inkrementujemy
oba
if PMask^=PS^ then
begin
inc(PMask);
inc(PS);
end else
// Je�li nie, oznacza to, �e ci�g nie pasuje do maski.
begin
result:=false;
exit
end;
end;
end;
end;
// Maska sko�czy�a si�. Je�li ci�g znak�w r�wnie� - oznacza to, �e pasuje
// do niej.
if PS^=#0 then
result:=true else
result:=false;
end;
begin
if CaseSensitive then
result:=InternalStringMatchesMask(PChar(s), PChar(mask)) else
result:=InternalStringMatchesMask(PChar(UpperCase(s)),
PChar(UpperCase(mask)));
end;
No i w�asnie chcia�bym uzgodni� czy to b��d systemowy czy te� ja o czym�
nie wiem.
> Mo�na filtrowa� samemu u�ywaj�c funkcji kt�r� kiedy� na tej grupie poda�
> Wojciech Spook Sura:
>
> function StringMatchesMask(S, mask: string; CaseSensitive:
> Boolean = false): Boolean;
Tak� funkcje mam, tylko chcia�em jej nie u�ywa�.
--
Pozdrawiam
dziobu
xyzyk.pl
A mo�na co� wi�cej?
Bo tam nie ma nic przydatnego.
--
Pozdrawiam
dziobu
xyzyk.pl
cFileName
A null-terminated string that is the name of the file. Tu masz pełną
długą nazwę
cAlternateFileName a tu masz w formacie 8.3
A null-terminated string that is an alternative name for the file. This
name is in the classic 8.3 (filename.ext) filename format.
--
pzdr
RyAn
No i...?
Bo dalej nie wiem co mi to daje.
--
Pozdrawiam
dziobu
xyzyk.pl
--
marfi
Napierw chcia�bym wiedzie� z czego to wynika �e on mi w jednym
konkretnym przypadku zwraca tak a nie inaczej.
Opr�cz tego �e lubie wiedzie� jak co� dzia�a, to przy okazji chcia�bym
pozna� ewentualne inne wady tego rozwi�zania. Zanim znowu sp�dze u
klienta p� dnia szukaj�c fajnego b��du.
--
Pozdrawiam
dziobu
xyzyk.pl
--
marfi
No w�a�nie. Posprawdza�em tu i �wdzie i wychodzi faktycznie na to �e to
systemowy b��d. Na XP, Vi�cie i testowym W7.
Powiem w skr�cie - ale SZIT.
Dzieďż˝ w plecy. Nawet nie ma kogo opierdoliďż˝.
Jak sie tak g��biej zastanowi� to w niekt�rych przypadkach mo�e to
stanowi� nawet luke w bezpiecze�stwie systemu...
--
Pozdrawiam
dziobu
xyzyk.pl
Podejrzewam raczej że nie jest to błąd ale "feature".
Może być to związane z potrzebą zapewnienia kompatybilności z krótkim
formatem nazw (8.3). System jak skraca nazwę, to z długiego rozszerzenia
robi 3-znakowe. W Twoim przypadku, jak system dostaje nazwę *.txt to
może założyć że jest to nazwa skrócona, i dlatego wyszukuje wszystkie
długie nazwy które po skróceniu pasowały by do wzorca. W przypadku jeśli
użyjesz nazwy z 2 lub 4 znakowym rozszerzeniem, to system ma pewność że
żadna skrócona nazwa by nie pasowała.
--
Te� o tym my�la�em. Tylko jak sie tak g��biej zastanowi� - to nie ma
sensu. Windows od zawsze (<=3.11 pomijam) pozwala� na d�ugie nazwy
plik�w. I d�ugie rozszerzenia tak�e. Wi�c jako� nie widze tu miejsca na
tak� "kompatybilno��" bo nie wiem komu to mia�o by s�u�y�. Je�li ju�, to
powinno to mie� zupe�nie osobn� funkcje operuj�c� na formacie 8.3,
nazywanym tu i tam AlternativeFileName. Ale tego w msdn'ie nie znalaz�em.
http://xyzyk.pl/inne/bug.jpg
:)
--
Pozdrawiam
dziobu
xyzyk.pl
Eh, młodzież... Myśli że Windows miał długie nazwy "od zawsze" ;-)
Właśnie chodzi o to że sporo API windows pochodzi z czasów Win3 i nazw
8.3 . A MS stara się zawsze zachować kompatybilność, o ile się da.
Podejrzewam że kod realizujący FindFirstFile() pochodzi jeszcze z Win95,
który pierwszy miał długie nazwy... I skoro Ciągle działa zgodnie z
założeniami to nikt go nie próbował poprawić.
Widać nie musiałeś nigdy wprowadzać poprawek do już istniejącego,
starego systemu... gdzie sporo kodu służy tylko do obchodzenia już
naprawianych błędów w systemie czy bibliotekach ;-)
--
Arivald
Z tego mi sie podoba to "my�li". nareszcie kto� to zauwazy� ;p
> W�a�nie chodzi o to �e sporo API windows pochodzi z czas�w Win3 i nazw
> 8.3 . A MS stara si� zawsze zachowa� kompatybilno��, o ile si� da.
To do�c wybi�rczo to robi�.
> Podejrzewam �e kod realizuj�cy FindFirstFile() pochodzi jeszcze z Win95,
> kt�ry pierwszy mia� d�ugie nazwy... I skoro Ci�gle dzia�a zgodnie z
> za�o�eniami to nikt go nie pr�bowa� poprawi�.
Szkoda tylko �e nigdzie nie ma tych za�o�e�.
> Wida� nie musia�e� nigdy wprowadza� poprawek do ju� istniej�cego,
> starego systemu... gdzie sporo kodu s�u�y tylko do obchodzenia ju�
> naprawianych b��d�w w systemie czy bibliotekach ;-)
Na PC dopiero wchodze w taki etap ;)
--
Pozdrawiam
dziobu
xyzyk.pl
No nic. Czyli ten typ tak ma. Szkoda.
Poprawie sobie funkcje w biliotekach i b�dzie OK.
Dzieki za pomoc.
--
Pozdrawiam
dziobu
xyzyk.pl