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