Przeglądanie katalogów

0

<font size="2">W jaki sposób przejrzeć katalog łącznie z jego podkatalogami w poszukiwaniu plików odpowiadających zadanej masce (np. "plik*.txt")?</span>

Załóżmy, że mam drzewo katalogów, w którym chcę znaleźć pliki o nazwach p??k*.txt, a efekty poszukiwań wypisać na ekran w postaci ścieżki względem miejsca wywołania algorytmu.

Chodzi o system operacyjny Windows.

Od rana googluje i kilka rzeczy znalazłem, ale nie bardzo wiem jak się do nich zabrać.

Proszę o pomoc.

--
Szach

0

Zerknij na tą stronę

www.winapi.org

tam jest cały artykuł na temat przeszukiwania dysku twardego pod kontem plików.

Pozdrawiam.

0
Herk napisał(a)

www.winapi.org

Dzięki za linka. Zaraz się z nim zapoznam.

Tymczasem pokażę, co udało mi się do tej pory zrobić:

#include <windows.h>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <conio.h>
#include <vector>
#include <string>

using namespace std;

class PathList
{
   private:
      vector <string> v;
      vector <string> :: const_iterator p1;
   public:
      void add(string);
      string take(int);
      int size();
      int capacity();
};

void PathList :: add(string s)
{
   v.push_back(s);
}

string PathList :: take(int x)
{
   p1 = v.begin();
   p1 = p1 + x;
   return *p1;
}

int PathList :: size()
{
   return v.size();
}

int PathList :: capacity()
{
   return v.capacity();
}

// Funkcja budujaca sciezke wg. wzoru: Directory\FileName
char* BuildPath(const char* Directory, const char* FileName)
{
    size_t      required_space;
    char*       retval;
    size_t      directory_len;
    
    directory_len = strlen(Directory) + 1;
    
    required_space = directory_len + strlen(FileName) + 1;
    retval = new char[required_space];
    strncpy(retval, Directory, directory_len);
    retval[directory_len--] = 0;
    retval[directory_len] = '\\';
    strcat(retval, FileName);
    
    return retval;
}

// Funkcja wyrzucajaca na wyscie wszystkie podkatalogi (rekurencyjnie)
void ShowSubdirs(const char* Directory, PathList &vec)
{
    WIN32_FIND_DATA     wfdata;
    HANDLE              hsearch;
    char*               spath;
    
    spath = BuildPath(Directory, "*");
    if (hsearch = FindFirstFile(spath, &wfdata))
    {
        delete[] spath;
        spath = NULL;
        
        do
        {
            if (wfdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                spath = BuildPath(Directory, wfdata.cFileName);
                if(spath[strlen(spath)-1] != '.')
                    vec.add(spath);
                if (!(wfdata.cFileName[0]=='.' && wfdata.cFileName[1]==0) &&
                    !(wfdata.cFileName[0]=='.' && wfdata.cFileName[1]=='.' &&
                    wfdata.cFileName[2]==0))
                {
                    ShowSubdirs(spath, vec);
                }
                delete[] spath;
                spath = NULL;
            }    
        }
        while (FindNextFile(hsearch, &wfdata));
        FindClose(hsearch);
    }
    
    delete[] spath;
}

int main()
{
   PathList x; // tworze vector
   ShowSubdirs("f:\\test", x); // zapisuje do vectora podkatalogi
   for(int i=0; i<x.size(); i++) // wypisuje podkatalogi na ekran
   {
      cout << x.take(i) << endl;
   }
   getch();
   return 0;
}

Funkcje BuildPath() i ShowSubdirs() znalazłem gdzieś w sieci.
Zrobiłem sobie taką małą klasę PathList i jak na razie działa!
Znajduje wszystkie podkatalogi w katalogu podanym jako argument funkcji ShowSubdirs().

Teraz muszę w każdym z tych katalogów znaleźć pliki, które są zgodne z podaną maską i
jak na razie nigdzie nie mogę znaleźć jak przeszukać katalog w poszukiwaniu plików zgodnych z maską.

Znalazłem tylko funkcję, która znajduje pliki i podkatalogi w danym katalogu.
Katalogi mogę odsiać porównując je z zawartością vectora, który już mam,
ale jak wybrać z tego, co zostanie (listy plików) te pliki, które odpowiadają masce?

--
Szach

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