arrowHome Monday, 06 September 2010  



 
Google
Web winapi.org
Main Menu
Home
News
FAQ
Links
Download
Kontakt
FORUM

Artykuły
Podstawy
GDI i Multimedia
Kontrolki
inne
Winapi + asm
WinSock
Soft
Login Form
Login

Hasło

Zapamiętaj mnie
Nie pamiętasz hasła?
Nie masz konta? Załóż je sobie
Algorytm przeszukiwania dysku #2 Drukuj E-mail
Oceny: / 22
KiepskiBardzo dobry 
Nadesłał Nicon   
Saturday, 03 December 2005

Witam!!!

Postanowiłem napisać kolejną część artykułu o przeszukiwaniu dysku ponieważ dostrzegłem, że jest na niego dośc duże zapotrzebowanie ;]. Udało mi się napisać nową szybszą i skuteczniejszą wersję. W tej wersji nie korzystam już z rekurencji co naturalnie daje duży skok w szybkości i znaczne zmniejszenie zużycia pamięci.

To tyle tytułem wstępu, czas na omówienie funkcji szukającej.

// Funkcja do odcinania od ścieżki ostatniego czlonu

void Trunc( char *path )
{
  int i = strlen( path )-1;
  path[i--] = '';

  for ( ; i > 0; i-- )
  {
    if ( path[i] != '' ) path[i] = '';
    else break;
  }
}

// Funkcja szukająca

BOOL Szukaj( char *curdir, char *file )
{
  BOOL IsFile = TRUE;
  HANDLE Handles[1500]; //Uchwyty używane do zapamiętywania ostatnio przeszukiwanych katalogów na danym poziomie
  char path[ MAX_PATH + _MAX_FNAME ]; //Zmienna do przechowywania aktualnej sciezki
  BOOL bFileFindet = FALSE;
  WIN32_FIND_DATA wfd;

  for ( int i = 0; i < 1500; i++ ) Handles[i] = NULL; 
 
  i = 0;
  strcpy( path, curdir );
  SetCurrentDirectory( path );
  Handles[0] = FindFirstFile( "*.*", &wfd );

  while ( ( ( IsFile ) || ( strlen( path ) > 0 ) ) && ( !bFileFindet ) )
  {
    while ( IsFile )
    {
      if ( !(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
      {
         if ( ( stricmp( wfd.cFileName, file ) == 0 ) )
         {
           GetFullPathName( wfd.cFileName, _MAX_PATH + _MAX_FNAME, path, NULL );
           bFileFindet = TRUE; MessageBox( NULL, "Znalazłem ten plik!!", path, NULL );
         }
      } 

      if ( (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (wfd.cFileName[0] != '.') && (!bFileFindet) )
      {
         // dopisanie do aktualnej sciezki jednego katalogu do którego wejdziemy
         wsprintf( path, "%s%s", path, wfd.cFileName );
         //wejście katalog dalej
        SetCurrentDirectory( path );
        Handles[++i] = FindFirstFile( "*.*", &wfd );
     } else IsFile = FindNextFile( Handles[i], &wfd );
    }

    // Wyjście katalog wyżej
    SetCurrentDirectory("..");
    // Obcięcie aktualnej sciezki o jeden katalog
    Trunc( path );
    // skasowanie jednego uchwytu
    Handles[i--] = NULL;
    if ( i >= 0 )
    {
      IsFile = FindNextFile( Handles[i], &wfd );
    }
  }

  // Zwrocenie true jeżeli plik znaleziony lub false w przeciwnym wypadku
  return bFileFindet;
}

Gotowy przykład użycia można ściągnąć tutaj

Większość elementów zostaje taka sama jak w wersji pierwszej także w razie jakichkolwiek niejasności proszę tam zajrzeć, algorytm został poddany jedynie małej derekursywacji ;] która przyniosła b. dobre rezultaty. To by było na tyle.


Życzę miłego pisania, Nicon.

Ostatnia aktualizacja ( Wednesday, 28 March 2007 )
< Poprzedni
Ankieta
Jak ocenisz poziom swoich umiejętnośći?
  
Dodaj do ulubionych
Ustaw stronę startową
Ostatnio dodane
Popularne
 
top

www.winapi.org © 2003 - 2007