Poważne błędy w FindFirst w Delphi

0

Prawdopodobnie w funkcji FindFirst są dwa poważne problemy z wyszukaniem plików.

1. Wyszukanie ukrytych folderów:
http://www.tek-tips.com/viewthread.cfm?qid=1418012

2. Wyszukiwanie wszystkich plików w Vista/7 jest nieprawidłowe (pewne pliki mają inne atrybuty niż jest w dokumentacji):
http://groups.google.com/group/pl.comp.lang.delphi/browse_thread/thread/d14f93c0f1fa8cbd/12de0fce403ee354?#12de0fce403ee354
http://bugs.freepascal.org/view.php?id=9440

Są to na tyle poważne problemy, że nawet Delphi 2010 nie przynosi ich naprawienia.

Czy ktoś spotkał się już z tymi problemami ?
Myślę, że dyskusja na ten temat jest wskazana, bo w nowym systemie Windows7 i Viście dzieją się cuda z wyszukiwaniem !

no cóż... może i trzeci błąd to jest :
http://groups.google.com/group/pl.comp.lang.delphi/browse_thread/thread/dbce08153c397fa2

0

Google nie boli:

If you are writing a 32-bit application to list all the files in a directory and the application may be run on a 64-bit computer, you should call the Wow64DisableWow64FsRedirectionfunction before calling FindFirstFile and call Wow64RevertWow64FsRedirection after the last call to FindNextFile. For more information, see File System Redirector.

Już nie mówię o tym, że w Vista można używać

FindFirstFileTransacted

.

0

Nie znane funkcje... więc jak je wywołać ? Już nie mówiąc o tym, że wywołać je chyba trzeba tylko w systemie 64-bitowym w aplikacji 32-bitowej.

Wow64DisableWow64FsRedirection
Wow64RevertWow64FsRedirection
FindFirstFileEx
FindFirstFileTransacted

A my tu mówimy o systemie Windows Vista/7 32-bit i aplikacji 32-bit.

Poza tym gdzie są Misiekd i olesio ?

Czy na prawdę nikt nie potrafi się sensownie wypowiedzieć ? W końcu chyba każdemu zależy na tym, aby aplikacje były kompatybilne z Windows Vista/7....

No ludzie co jest z wami [!!!]

0

no ale czego oczekujesz? Ten błąd (ja wiem czy to błąd) z atrybutami plików wynika z tego, że w nowych windowsach faAnyFile ma inną wartość niż w starych. Odpowiedź na to jest banalna i tak chyba trzeba robić -

Po prostu trzeba sobie zdefiniować

faWhatever = $FFFFFFFF; //cokolwiek M$ jeszcze wymyśli w przyszłości

i używać jako atrybutów poszukiwania :-)

Co do trzeciego to tak zwracają funkcje systemowe więc Delphi nie ma tu nic do gadania bo i w c++ czy c# zadziała to tak samo (o ile będziesz używał FindFirstFile czy też Delphiowej obudowy FindFirst)

Na 99% problem z ukrytymi to nie wina Delphi tylko windowsa. Zamiast FindFirst i FindNext weź sobie FindFirstFile i FindNextFile i zobacz jak zadziałają, bo jestem pewny, że tak samo

0

Błąd jest po stronie Delphi, nierozsądnym było przyjęcie wartości faAnyFile z tylko konkretnymi flagami zamiast wszystkich. To że w nowszym Delphi zmieniono tę wartość dodając jakieś flagi tylko świadczy, że CodeGear sie jeszcze tego nie nauczyło.

0

Wywołany do tablicy powiem, że nie mam na ten temat za bardzo wiedzy i zdania, bo sam z wyszukiwania
plików korzystam rzadko w swoich aplikacjach. Poza tym używam - póki mam starszy komputer - Windowsa
XP Home SP 2 i od "Wisty" czy siódemki stronie jak się da. Na pewno "majkrosowt" wprowadzając UAC czy
inne pierdołki w "Wiście" przedonrzył i przez to są też problemy z innymi elementami systemu jak choćby to
wyszukiwanie plikó, o ktorym wspomniałeś. Dziwne tylko że najnowsze Delphi sobie z tym nie radzi jakoś ;/

0

Programista NIE MOŻE stronić od nowszych systemów, czy zakładać że najnowszy Windows ABC jest do d_py i dlatego nie będzie poprawiać swojego programu.
Chyba że jest to "programista-egoista", który w życiu jeszcze żadnego programu nie wydał (nawet po kolegach). Przecież publika tak czy siak najnowsze komputery i systemy będzie miała, z czasem coraz częściej.

0

Co do problemu nr 2, to użycie:

FindFirst('*.*', $FFFFFFFF, SearchRec);

jest wyjściem poza zakres.

Natomiast w innym rozwiązaniu piszą, aby zastosować:

FindFirst('*.*', faAnyFile or $00000080, SearchRec);

co w rzeczywistości nie przynosi poprawy...choć mogę się mylić.

Natomiast problem nr 1 rozwiązałem następująco:

private
  procedure ZnajdzPlik(Sciezka: String; Filtry: TStringList);

var
  Form1: TForm1;
  ListaWynikow: TStringList;

procedure TForm1.ZnajdzPlik(Sciezka: String; Filtry: TStringList);
var
 i: SmallInt;
 j: Byte;
 VerifMask: TMask;
 Poprawne: Boolean;
 SR1, SR2: TSearchRec;
begin
 if Sciezka[Length(Sciezka)] <> '\' then Sciezka := Sciezka + '\';

 i := FindFirst(Sciezka + '*.*', faAnyFile, SR1);
 try
  while i = 0 do
    begin
     Application.ProcessMessages;
     if ((SR1.Attr and faDirectory) = 0) and (SR1.Name <> '.') and (SR1.Name <> '..') then
       begin
        for j := 0 to Filtry.Count-1 do
          begin
           VerifMask := TMask.Create(Filtry.Strings[j]);
           Poprawne  := VerifMask.Matches(SR1.Name);
           VerifMask.Free;

           if Poprawne and (ListaWynikow.IndexOf(Sciezka + SR1.Name) = -1) then ListaWynikow.Add(Sciezka + SR1.Name);
           Break;
          end;
       end;

     i := FindNext(SR1);
    end;

  {Szukanie w podfolderach}
  i := FindFirst(Sciezka + '*.*', faDirectory + faHidden, SR2);
  while i = 0 do
    begin
     if ((SR2.Attr and faDirectory) = faDirectory) and (SR2.Name <> '.') and (SR2.Name <> '..') then
       if Pos('\winsxs', Sciezka + SR2.Name) = 0 then ZnajdzPlik(Sciezka + SR2.Name, Filtry);
     i := FindNext(SR2);
    end;

 finally
  FindClose(SR1);
  FindClose(SR2);
 end;
end;

//Wywołanie:
var
 ListaFiltrow: TStringList;
begin
 ListaFiltrow := TStringList.Create;
 ListaWynikow := TStringList.Create;
 ListaFiltrow.Add('*.exe');
 ListaFiltrow.Add('*.dll');

 ZnajdzPlik('C:\', ListaFiltrow);

 ListaFiltrow.Free;
 //--> odczytaj listę wyników z 
 //ListaWynikow

 ListaWynikow.Free;
end;

Szczególnie proszę zwrócić uwagę na:

i := FindFirst(Sciezka + '*.*', faDirectory + faHidden, SR2);

W takiej modyfikacji, zarówno pliki jak i foldery ukryte są znajdywane (szczególnie w Windows 7 dotyczy to folderu: C:\Users<uzytkownik>\AppData\ ).

Dalej nie rozumiem natomiast co ma wspólnego aplikacja 32-bitowa na systemie 32-bitowym z funkcjami:

Wow64DisableWow64FsRedirection
Wow64RevertWow64FsRedirection

i czy rzeczywiście te funkcje trzeba wywołać na systemie 64-bitowym.
Jeśli tak to jak ? bo przecież nie są to znane funkcje.

0
Azarien napisał(a)

Programista NIE MOŻE stronić od nowszych systemów, czy zakładać że najnowszy Windows ABC jest do d_py i dlatego nie będzie poprawiać swojego programu.
Chyba że jest to "programista-egoista", który w życiu jeszcze żadnego programu nie wydał (nawet po kolegach). Przecież publika tak czy siak najnowsze komputery i systemy będzie miała, z czasem coraz częściej.

Azarien, po części masz rację. Jeśli działasz w firmie lub masz fundusze. Postaw się jednak w mojej (i pewnie wielu innych programistów) sytuacji: człowiek pisze w Delphi 3-7, na starym komputerze. Wychodzi nowy system operacyjny i co? To znaczy że mam płacić XXX polskich złotych, za system + najprawdopodobniej nowy sprzęt, bo przecież pod Duronem 800 Mhz NOWY system nie pójdzie.

Druga sprawa, co z kompatybilnością wstecz? Może od razu porzucić wszystko poniżej NOWY system i skupić się tylko na nim. A jeśli nie, to znaczy że musze posiadać u siebie X-systemów tylko po to aby przed opublikowaniem aplikacji przetestować czy się uruchomi na każdym z nich. A jak się nie uruchomi? Zawsze łatwo powiedzieć 'programista-egoista'.

0

Niestety ale tak już jest... piszesz program dla ludzi, musisz inwestować w jego rozwój. A więc musisz testować na równych systemach i mieć do tego odpowiedni sprzęt.
Jeśli temu nie podołasz, Twoja aplikacja prędzej czy później odejdzie i dołączy do aplikacji Abandonware.

1 użytkowników online, w tym zalogowanych: 0, gości: 1