Dodaj do ulubionych

Borland C++ problem z findfirst i findnext

19.05.15, 16:50
Prosty programik wyszukiwania plików *.scr skompilowany przez Borland C++ ver. 5.02

#include <dir.h>
#include <stdio.h>
#include <conio.h>

int main(int argc, char **argv) {
struct ffblk Holder;
int Status;
char Path[256] = "C:\\windows\\system32";
int i=0;

if(argc >= 2 ) {
strcpy(Path, argv[1]);
}
//Search for screensavers and print them out
strcat(Path, "\\*.scr");
printf("Search for %s\n",Path);
Status=findfirst(Path, &Holder, 0);
while(!Status) {
// cout << Holder.ff_name << endl;
printf("%s\n", Holder.ff_name);
Status=findnext(&Holder);
i++;
}
printf(" %4d files found\n",i);
// getch();
//Exit
return 0;
}
daje takie wyniki;
Search for C:\windows\system32\*.scr
Bubbles.scr
Mystify.scr
PhotoScreensaver.scr
Ribbons.scr
scrnsave.scr
ssText3d.scr
6 files found

Te wyniki są złe, bo we wskazanym katalogu plików *.scr jest o 2 więcej
Gdy tych samych plików poszukać przez systemową komendę dir otrzymuje się taki oto wynik:

Wolumin w stacji C to Acer
Numer seryjny woluminu: 684C-C3BC

Katalog: C:\windows\system32

2009-12-24 04:34 453˙152 Acer.scr
2010-11-20 15:24 899˙584 Bubbles.scr
2012-04-17 00:51 273˙408 Lemurki.scr
2010-11-20 15:24 242˙688 Mystify.scr
2010-11-20 15:24 477˙696 PhotoScreensaver.scr
2010-11-20 15:24 241˙664 Ribbons.scr
2009-07-14 03:38 11˙264 scrnsave.scr
2010-11-20 15:24 333˙824 ssText3d.scr
8 plik(˘w) 2˙933˙280 bajt˘w
0 katalog(˘w) 373˙638˙389˙760 bajt˘w wolnych

Czy ktoś umie to wyjaśnić ?
Obserwuj wątek
    • wariant_b Re: Borland C++ problem z findfirst i findnext 19.05.15, 20:48
      sprawdź i podaj: attrib c:\windows\system32\*.scr
      być może te acerowskie wygaszacze mają ustawione jakieś atrybuty plików.
      • indris Re: Borland C++ problem z findfirst i findnext 19.05.15, 23:09
        Niestety, wynik jest taki:
        :\prolog\qd32xb> attrib c:\windows\system32\*.scr
        A C:\windows\system32\Acer.scr
        A C:\windows\system32\Bubbles.scr
        A C:\windows\system32\Lemurki.scr
        A C:\windows\system32\Mystify.scr
        A C:\windows\system32\PhotoScreensaver.scr
        A C:\windows\system32\Ribbons.scr
        A C:\windows\system32\scrnsave.scr
        A C:\windows\system32\ssText3d.scr
        Jak widać, wszystkie wygaszacze mają identyczne atrybuty.
        Nie wszystkie te wygaszacze są acerowskie. Wygaszacz Lemurki.scr jest mój i działa
        Ale jego właśnie nie chciał pokazać inny mój program mający być uogólnieniem komendy DIR. Tamten program jest dość długi i skomplikowany, więc ściągnąłem z sieci program możliwie najprostszy (lekko go modyfikując)
        • wariant_b Re: Borland C++ problem z findfirst i findnext 19.05.15, 23:36
          > Nie wszystkie te wygaszacze są acerowskie.

          Dokładnie te dwa, których program nie widzi, nie pochodzą od systemu
          więc nie mam jak sprawdzić, co jest w nich odmiennego niż w innych.
          A patrzyłeś, co jest z plikami z innymi rozszerzeniami lub całością plików?
          • wariant_b Re: Borland C++ problem z findfirst i findnext 19.05.15, 23:47
            A sprawdź mi jeszcze tutaj: attrib C:\Windows\SysWOW64\*.scr
            • indris Re: Borland C++ problem z findfirst i findnext 20.05.15, 10:45
              wariant_b napisał:

              > A sprawdź mi jeszcze tutaj: attrib C:\Windows\SysWOW64\*.scr

              Wynik jest taki:
              C:\prolog\qd32xb> attrib C:\Windows\SysWOW64\*.scr
              A C:\Windows\SysWOW64\Bubbles.scr
              A C:\Windows\SysWOW64\Mystify.scr
              A C:\Windows\SysWOW64\PhotoScreensaver.scr
              A C:\Windows\SysWOW64\Ribbons.scr
              A C:\Windows\SysWOW64\scrnsave.scr
              A C:\Windows\SysWOW64\ssText3d.scr

              DIR widzi te same pliki, findtest0 również.
              • wariant_b Re: Borland C++ problem z findfirst i findnext 20.05.15, 11:09
                No to się nam chyba sprawa rozwiązała.
                Zrób hardlinki do brakujących Acer.scr i Lemurki.scr w SysWOW64
                i zobacz, czy twój program pokaże je jako pliki występujące w System32.
                • indris Dziękuję !!! 20.05.15, 16:04
                  wariant_b napisał:
                  " No to się nam chyba sprawa rozwiązała.
                  Zrób hardlinki do brakujących Acer.scr i Lemurki.scr w SysWOW64
                  i zobacz, czy twój program pokaże je jako pliki występujące w System32."

                  Rzeczywiście to zadziałało. Chyba jeszcze nigdy nie byłem tak zdumiony. Teraz będę próbował to zrozumieć.
                  Czy nie jest przypadkiem tak, że system jakoś specjalnie traktuje ścieżkę, która zaczyna się od C:\windows\system32 ? Bo nie wspominałem, że pliki Lemurki.scr i Acer.scr były widziane, kiedy dla eksperymentu umieszczałem je na innych ścieżkach.
                  Jeszcze raz dziękuję !
                  • wariant_b Re: Dziękuję !!! 20.05.15, 22:21
                    > Rzeczywiście to zadziałało. Chyba jeszcze nigdy nie byłem tak zdumiony.

                    Przypomniało mi się zdumienie kolegi, który 32-bitowym Total Commanderem
                    usiłował znaleźć pliki, które przed chwilą wgrał sobie do systemu.
                    Zasugerowałem mu, żeby zainstalował 64-bitową wersję TC i sprawdził
                    raz jeszcze, to się znajdą. Były.

                    Tu szwindel polega na tym, że 32-bitowy program może czegoś szukać
                    w kartotece System32, która jak sama nazwa wskazuje w systemach
                    64-bitowych zawiera wyłącznie wersje 64-bitowe. Więc odwołania do
                    tej kartoteki są przechwytywane i przekierowywane tam, gdzie znajdują
                    się wersje 32-bitowe, czyli jak łatwo się domyślić SysWOW64.
                    Tamże instalator systemu umieścił hardlinki do swoich plików .scr,
                    a Acer i ty tego nie zrobiliście, więc aplikacja 32-bitowa nie widziała ich.

                    Podobnie, ale tutaj rzecz jest ogólnie znana, dzieje się z kartoteką programów.
                    32-bitowa aplikacja też jest święcie przekonana, że znajduje się w Program Files
                    i 64-bitowy system utwierdza ją w tym przekonaniu. I dość podobnie z kartotekami
                    użytkowników, które jak łatwo się przekonać, co wersję systemu są inne, choć
                    teraz system na wszelki wypadek ich nie wyświetla, żeby użytkownik nie nabroił.

                    Dodatkowo masz jeszcze pewnie zainstalowane Microsoft Visual C++ Redistributable
                    w różnych wersjach - te teź potrafią wpływać na to, co gdzie program ma lub szuka.
                    Tu trochę ubawu mieliśmy z Live Mail 2012 - durniał i nie uruchamiał się, jeśli
                    w systemie było VCR2012 64-bitowe, a nie było wersji 32-bit. Wystarczało dodać
                    (lub usunąć), żeby mógł przy pierwszym uruchomieniu wyświetlić licencję,
                    a potem to było mu już wszystko jedno.

                    Ale to wszystko drobiazgi - lepsza zabawa jest w winsxs i rejestrze.

Nie masz jeszcze konta? Zarejestruj się


Nakarm Pajacyka