Wyszukiwarka plików w podfolderach

0

Jestem początkujący w temacie C++. Bardzo prosiłbym o pomoc w zmodyfikowaniu poniższego kodu, tak aby wyszukiwanie pliku miało miejsce nie tylko we wskazanym folderze, ale również w jego podkatalogach, gdyż szukany przeze mnie plik znajduje się w jednym z podkatalogów. Potrzebuje ostatecznie zapisać ścieżkę znalezionego pliku do pliku do zmiennej. Bardzo proszę o pomoc.

#include <stdafx.h>
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    WIN32_FIND_DATA File_Data;
    
    FindFirstFile( TEXT( "C:\\test\\plik.txt" ), & File_Data );
    wcout << File_Data.cFileName;
    
    cin.get();
    return 0;
}
0

Tutaj masz opisane jak zrobić funkcję przeszukującą foldery i podfoldery (tylko że wykorzystującą funkcje _findfirst i _findnext): http://www.obliczeniowo.jcom.pl/?id=374

Nie oznacza to jednak, że nie da się na podstawie tej funkcji napisać funkcję działającą bardzo podobnie z wykorzystaniem FindFirstFile oraz FindNextFile. Poza tym będziesz musiał troszeczkę pogłówkować, bo funkcja opisana na stronie z linka jedynie wyświetla listę plików spełniających podane kryteria przeszukiwania.

P.S.

Poczytaj sobie co struktura File_Data zawiera w sobie (pole cFileName nie jest jej jedynym polem), jest tam jeszcze pole dotyczące atrybutów pliku/folderu, po których można stwierdzić czy dany element jest folderem czy plikiem. A i jeszcze jedno, powinieneś po zakończonym przeszukiwaniu ścieżki użyć funkcji FindClose. Dokumentację trzeba czytać to wtedy będziesz wszystko wiedział. Jak nie masz dokumentacji to w google wpisujesz FindFirstFile i szukasz przykładowego prostego kodu pokazującego jak używać tej funkcji.

1

Może użyj std::filesystem? Albo z boosta. Jak wolisz. Wtedy to by wyglądało mniej więcej tak.

std::vector<std::experimental::filesystem::path> foo( const std::experimental::filesystem::path &path,
													  const std::experimental::filesystem::path &filenameToFind )
{
	namespace fs = std::experimental::filesystem;
	
	std::vector<fs::path> result;
	auto pred = [&filenameToFind, &path]( const auto &it )
	{
		return it->path().filename() == filenameToFind;
	}

	if( fs::exists( path )
		&& fs::is_directory( path ) )
	{
		std::copy_if( fs::recursive_directory_iterator( path ), 
					  fs::recursive_directory_iterator() , 
					  std::back_inserter( result ),
					  pred );
		
	}
	
	return result;
}

To może się nie kompilować, bo pisałem z głowy, ale masz tu tyle słów kluczowych, że w googlach nie starczy miejsca na wyniki (:

EDIT
Dodam tylko, że w wektorze będą też ścieżki do folderów, nie same pliki

EDIT2
Dobra doczytałem, że szukasz pliku. Zmieniłem kod. Dalej nie daje gwarancji, że się kompiluje bo nie próbowałem

0

Ja do szukania w odtwarzaczu plików muzycznych używam tego kodu. Musisz tylko zmienić początek:

 
void fDrop_Read(const char *sDir, HWND *hwnd){
    WIN32_FIND_DATA fdFile;
    HANDLE hFind = NULL;

    char sPath[2048];

    sprintf(sPath, "%s\\*.*", sDir);

    if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
     return;

    do
    {
        if(strcmp(fdFile.cFileName, ".") != 0
                && strcmp(fdFile.cFileName, "..") != 0)
        {
            sprintf(sPath, "%s\\%s", sDir, fdFile.cFileName);
            if(fdFile.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)
            {
                fDrop_Read(sPath, hwnd); 
            }
            else{
                /// Jest PLIKIEM
                if(fDrop_SprawdzRozszerzenie(sPath))
                {
                    if(hwnd == NULL)
                     fList_DodajElement(sPath, NULL);
                    else
                     fList_DodajElement(sPath, hwnd);
                }
            }
        }
    }
    while(FindNextFile(hFind, &fdFile)); //Find the next file.

    FindClose(hFind); //Always, Always, clean things up!
}
void fDrop_ReadFirst(WPARAM wParam, HWND *hwnd){
    hDrop = (HDROP)wParam;
    char sItem[MAX_PATH];
    for(int i = 0; DragQueryFile(hDrop, i, (LPSTR)sItem, sizeof(sItem)); i++)
    {
        if(GetFileAttributes(sItem) &FILE_ATTRIBUTE_DIRECTORY)
        {
            /// Jest KATALOGIEM
            if(hwnd == NULL)
             fDrop_Read(sItem, NULL);
            else
             fDrop_Read(sItem, hwnd);
        }
        else
        {
            /// Jest PLIKIEM
            if(fDrop_SprawdzRozszerzenie(sItem))
            {
                if(hwnd == NULL)
                 fList_DodajElement(sItem, NULL);
                else
                 fList_DodajElement(sItem, hwnd);
            }
        }
    }
    DragFinish(hDrop);
    fList_OdswiezScrollBar();
}

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