Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

FindFirst i długie rozszerzenie

17 views
Skip to first unread message

dziobu

unread,
Oct 27, 2009, 10:48:21 AM10/27/09
to
Witam,

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

GAD Zombie

unread,
Oct 27, 2009, 10:49:59 AM10/27/09
to
dziobu pisze:

> Witam,
>
> 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.

To prawda, tez to zaobserwowalem na XP 32bit.

--
GAD Zombie
http://gad.art.pl/ (a email dosc podobny ;))

RyAn

unread,
Oct 27, 2009, 2:35:18 PM10/27/09
to
dziobu pisze:
> Witam,
>
> 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.
>
Czytaj help files. Zainteresuj się tym
dwFileAttributes WIN32_FIND_DATA

--
pzdr
RyAn

Borneq

unread,
Oct 27, 2009, 2:41:07 PM10/27/09
to
U�ytkownik "dziobu" <xxx...@xxxx.xx> napisa� w wiadomo�ci
news:hc717m$hk9$1...@news.onet.pl...

> 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\*.txt', ...
> zwr�ci #2, #3 i #4 !!!

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;

dziobu

unread,
Oct 27, 2009, 2:57:15 PM10/27/09
to
Dnia 10/27/2009 7:41 PM, U�ytkownik Borneq napisa�:
(...)

>
> B��d Windows, czy te� dzia�anie niezgodne z oczekiwanym

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

dziobu

unread,
Oct 27, 2009, 3:00:25 PM10/27/09
to
Dnia 10/27/2009 7:35 PM, U�ytkownik RyAn napisa�:
>
> Czytaj help files. Zainteresuj siďż˝ tym
> dwFileAttributes WIN32_FIND_DATA

A mo�na co� wi�cej?
Bo tam nie ma nic przydatnego.

--
Pozdrawiam
dziobu
xyzyk.pl

RyAn

unread,
Oct 27, 2009, 3:21:42 PM10/27/09
to
dziobu pisze:

> Dnia 10/27/2009 7:35 PM, Użytkownik RyAn napisał:
>>
>> Czytaj help files. Zainteresuj się tym
>> dwFileAttributes WIN32_FIND_DATA
>
> A można coś więcej?

> Bo tam nie ma nic przydatnego.
>
Jak to nie ma nic przydatnego ?
A to ?

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

dziobu

unread,
Oct 27, 2009, 3:34:24 PM10/27/09
to
Dnia 10/27/2009 8:21 PM, U�ytkownik RyAn napisa�:

> Jak to nie ma nic przydatnego ?
> A to ?
>
> 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.

No i...?
Bo dalej nie wiem co mi to daje.

--
Pozdrawiam
dziobu
xyzyk.pl

marfi

unread,
Oct 27, 2009, 4:30:48 PM10/27/09
to
U�ytkownik "dziobu" <xxx...@xxxx.xx> napisa� w wiadomo�ci
news:hc7i01$4g9$1...@news.onet.pl...
Nazwďż˝ pliku - potrafisz sprawdziďż˝ czy Ci odpowiada?

--
marfi

dziobu

unread,
Oct 27, 2009, 4:41:24 PM10/27/09
to
Dnia 10/27/2009 9:30 PM, U�ytkownik marfi napisa�:

>>
> Nazwďż˝ pliku - potrafisz sprawdziďż˝ czy Ci odpowiada?

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

unread,
Oct 27, 2009, 5:02:01 PM10/27/09
to
U�ytkownik "dziobu" <xxx...@xxxx.xx> napisa� w wiadomo�ci
news:hc7ltl$grr$1...@news.onet.pl...

> Dnia 10/27/2009 9:30 PM, U�ytkownik marfi napisa�:
>>>
>> Nazwďż˝ pliku - potrafisz sprawdziďż˝ czy Ci odpowiada?
>
> Napierw chcia�bym wiedzie� z czego to wynika �e on mi w jednym konkretnym
> przypadku zwraca tak a nie inaczej.
>
Zapewne z powodu braku tester�w w MS lub ich ma�ej wyobra�ni... Zg�o� b��d
to za kilkana�cie lat poprawi� :)

--
marfi

dziobu

unread,
Oct 27, 2009, 5:14:09 PM10/27/09
to
Dnia 10/27/2009 10:02 PM, U�ytkownik marfi napisa�:

>>
> Zapewne z powodu braku tester�w w MS lub ich ma�ej wyobra�ni... Zg�o� b��d
> to za kilkana�cie lat poprawi� :)

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

Arivald

unread,
Oct 28, 2009, 2:18:56 AM10/28/09
to
dziobu pisze:
> Dnia 10/27/2009 10:02 PM, Użytkownik marfi napisał:
>>>
>> Zapewne z powodu braku testerów w MS lub ich małej wyobraźni...
>> Zgłoś błąd to za kilkanaście lat poprawią :)
>
> 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...
>

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.

--

dziobu

unread,
Oct 28, 2009, 3:58:49 AM10/28/09
to
Dnia 10/28/2009 7:18 AM, U�ytkownik Arivald napisa�:
>
> 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).
(...)

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

Arivald

unread,
Oct 28, 2009, 4:36:06 AM10/28/09
to
dziobu pisze:

> Dnia 10/28/2009 7:18 AM, Użytkownik Arivald napisał:
>>
>> 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).
> (...)
>
> 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.
>

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

dziobu

unread,
Oct 28, 2009, 4:51:59 AM10/28/09
to
Dnia 10/28/2009 9:36 AM, U�ytkownik Arivald napisa�:
>
> Eh, m�odzie�... My�li �e Windows mia� d�ugie nazwy "od zawsze" ;-)

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

dziobu

unread,
Oct 28, 2009, 4:53:57 AM10/28/09
to

No nic. Czyli ten typ tak ma. Szkoda.
Poprawie sobie funkcje w biliotekach i b�dzie OK.

Dzieki za pomoc.

--
Pozdrawiam
dziobu
xyzyk.pl

0 new messages