Ĺadny brzuch
Witam,
mam następujący problem:
piszę coś, co w przyszłości ma przypominać program antywirusowy. Jednym z etapów jest to,że użytkownik podaje katalog, a program powinien policzyć sumę kontrolną każdego z plików (np. wczytać wszystkie znaki fukcją get, rzutować je na int i dodać do siebie) i zapisać to w nowym pliku. Teraz moje pytanie: jakie są sposoby na przeszukiwanie katalogu. Jedyne, co udało mi się znaleźć to funkcje ftw, ale ona jest z C i później coś mi się wali. Jest coś podobnego w C++ ? A może wogóle znacie jakieś inne metody na to?
może jeszcze napiszę dokładniej, jak ja to robię:
mam taką klasę:
class anty { private: string sciezka; bool nowe_pliki; bool zmiana_kodu; public: string katalog() { return sciezka; } friend int zapisz_kod(const char *nazwa, const struct stat *statystyka, int typ); friend int porownaj_kod(const char *nazwa, const struct stat *statystyka, int typ); void kod_wzor(); void ustal_katalog (); anty() {nowe_pliki = true; zmiana_kodu = true;} };
fukcja odpowiedzialna za przeskanowanie katalogu:
void anty:: kod_wzor() { ustal_katalog(); ftw(sciezka.c_str(), zapisz_kod, 1); }
i dodatkowo fukcja, która jest wykonywana na rzecz każdego pliku:
int zapisz_kod(const char *nazwa, const struct stat *statystyka, int typ) { ofstream plik_p("sk.txt", ios::app ); ifstream plik_c("sk.txt"); string str; if (typ == FTW_D ) { string naz(nazwa);; str=naz; } if (typ == FTW_F) { string nazwa1(nazwa); string kopia = nazwa1; int pozycja; pozycja=nazwa1.rfind('/'); nazwa1.erase(0,pozycja+1); ifstream plik1(nazwa); if (!plik1) cout <<"nie moge otworzyc takiego pliku\n"; int kod=0; kod = pobierz_kod_kontrolny(plik1); string stri; char znak; while (plik_c.get(znak)) { stri=stri+znak; } if(stri.find(nazwa)==-1) { string naz(nazwa); str=naz; cout<<str; plik_p<<str; cout<<" "<<kod<<endl; plik_p<<" "<<kod<<" "<<endl; } } return 0; }
i wszystko niby działa, tylko jak z poziomu funkcji zapisz kod mogę sprawdzić jaką wartość ma zmienna nowe_pliki lub zmiana_kodu? Próbowałem też zmienić funkcję zapisz_kod jak metodę klasy,a nie frienda, ale wtedy wyskakuje jakiś dziwny błąd w linijce, gdzi wywołuję funkcję ftw:
formal argument 3 of type extern "C"...
zobacz sobie boost filesystem
Tu można użyć cokolwiek. Chociażby rekursywne przeszukiwanie katalogów jest możliwe w wielu małych programach dostępnych w sieci (chociażby tych z projektu GNU). Na stronie http://4programmers,net jest AFAIR napisane kilka słów na ten temat.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
mam następujący problem:
piszę coś, co w przyszłości ma przypominać program antywirusowy. Jednym z etapów jest to,że użytkownik podaje katalog, a program powinien policzyć sumę kontrolną każdego z plików (np. wczytać wszystkie znaki fukcją get, rzutować je na int i dodać do siebie) i zapisać to w nowym pliku. Teraz moje pytanie: jakie są sposoby na przeszukiwanie katalogu. Jedyne, co udało mi się znaleźć to funkcje ftw, ale ona jest z C i później coś mi się wali. Jest coś podobnego w C++ ? A może wogóle znacie jakieś inne metody na to?
może jeszcze napiszę dokładniej, jak ja to robię:
mam taką klasę:
class anty { private: string sciezka; bool nowe_pliki; bool zmiana_kodu; public: string katalog() { return sciezka; } friend int zapisz_kod(const char *nazwa, const struct stat *statystyka, int typ); friend int porownaj_kod(const char *nazwa, const struct stat *statystyka, int typ); void kod_wzor(); void ustal_katalog (); anty() {nowe_pliki = true; zmiana_kodu = true;} };
fukcja odpowiedzialna za przeskanowanie katalogu:
void anty:: kod_wzor() { ustal_katalog(); ftw(sciezka.c_str(), zapisz_kod, 1); }
i dodatkowo fukcja, która jest wykonywana na rzecz każdego pliku:
int zapisz_kod(const char *nazwa, const struct stat *statystyka, int typ) { ofstream plik_p("sk.txt", ios::app ); ifstream plik_c("sk.txt"); string str; if (typ == FTW_D ) { string naz(nazwa);; str=naz; } if (typ == FTW_F) { string nazwa1(nazwa); string kopia = nazwa1; int pozycja; pozycja=nazwa1.rfind('/'); nazwa1.erase(0,pozycja+1); ifstream plik1(nazwa); if (!plik1) cout <<"nie moge otworzyc takiego pliku\n"; int kod=0; kod = pobierz_kod_kontrolny(plik1); string stri; char znak; while (plik_c.get(znak)) { stri=stri+znak; } if(stri.find(nazwa)==-1) { string naz(nazwa); str=naz; cout<<str; plik_p<<str; cout<<" "<<kod<<endl; plik_p<<" "<<kod<<" "<<endl; } } return 0; }
i wszystko niby działa, tylko jak z poziomu funkcji zapisz kod mogę sprawdzić jaką wartość ma zmienna nowe_pliki lub zmiana_kodu? Próbowałem też zmienić funkcję zapisz_kod jak metodę klasy,a nie frienda, ale wtedy wyskakuje jakiś dziwny błąd w linijce, gdzi wywołuję funkcję ftw:
formal argument 3 of type extern "C"...
zobacz sobie boost filesystem
Tu można użyć cokolwiek. Chociażby rekursywne przeszukiwanie katalogów jest możliwe w wielu małych programach dostępnych w sieci (chociażby tych z projektu GNU). Na stronie http://4programmers,net jest AFAIR napisane kilka słów na ten temat.