[ Milan Aksic @ 11.08.2001. 20:58 ] @
Kako da napisem funkciju koja prolazi kroz sve direktorijume, lista fajlove, opet prolazi kroz sve subdirektorijume i lista sve fajlove i kroz subsubdirktorijume... ukratko lista sve fajlove i direktorijume na npr. C: ?
[ tOwk @ 12.08.2001. 03:22 ] @
Ja sam radio nedavno tako nesto, ali sa win32 API-jem (tj. FindFirstFile i FindNextFile iz win32-a).

Ukoliko te interesuje, mogu da postujem, ali mislim da je negde predator vec davao takav listing.

Toliko.
[ kajla @ 12.08.2001. 13:14 ] @
Kao sto je tOwk rekao, o tome je vec bilo reci na ovom forumu...znaci za to koristis funkcije FindFirst i FindNext naravno napravis rekurzivnu funkciju koja ce to da radi...

poz.
[ uLtracode @ 12.08.2001. 13:24 ] @
http://www.elitesecurity.org/tema.php?TopicID=531

slicna rasprava bila je ovde
[ Milan Aksic @ 12.08.2001. 15:52 ] @
Citat:
tOwk je napisao:
Ja sam radio nedavno tako nesto, ali sa win32 API-jem (tj. FindFirstFile i FindNextFile iz win32-a).

Ukoliko te interesuje, mogu da postujem, ali mislim da je negde predator vec davao takav listing.

Toliko.


Ajde ako nije problem postuj to sto si radio.
Pozdrav.
[ tOwk @ 13.08.2001. 00:37 ] @
Evo ga kod, sve je strpano u jedan C fajl, ovo je samo deo, pa je zato osaka�en, ali radi osnovni posao.

Kompajlirate ga, dobijete EXE i startujete ga sa jednim parametrom: imenom direktorijuma koji treba da izlista sa slash-om na kraju (npr. "a.exe c:").

Ukoliko je potrebna verzija za UNIX sisteme, recite i preradi�u ovo da radi i na njima.

Code:

#include <windows.h>
#include <stdio.h>
#include <string.h>

#define ALLOC(x) malloc(x)
#define FREE(x)  free(x)
#define GRESKA(x) { printf("GRESKA: %sn",x); exit(1); }

int izlistaj_dir(char *imedir);

int main(int argc,char *argv[]) {
// mora argument da ima slash na kraju, npr. c:windows, a ne c:windows
    izlistaj_dir(argv[1]);
    return 0;
}

int izlistaj_dir(char *imedir)
{
    HANDLE pretraga;
    WIN32_FIND_DATA podaci;
    BOOL kraj=1;
    int err,duzina;
    char *putanja;

    duzina=strlen(imedir);
    putanja=(char *) ALLOC(duzina+10);
    if (putanja == NULL) GRESKA("Ne ima memorije!n");
    strncpy(putanja,imedir,duzina+2);
    if (putanja[duzina-1] != '\') {
        strcat(putanja,"\");
    }
    strcat(putanja,"*.*");

    pretraga=FindFirstFile(putanja,&podaci);
    if (pretraga == INVALID_HANDLE_VALUE) GRESKA("NESTO NE VALJA!n");
    FREE(putanja); putanja=NULL;
    kraj=1;
    while (kraj == 1)
    {
        if ((podaci.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
        {
            if ((strcmp(podaci.cFileName,".") != 0) &&
                (strcmp(podaci.cFileName,"..") != 0))
            {
                putanja=(char *) ALLOC(duzina + strlen(podaci.cFileName) + 3);
                if (putanja == NULL) GRESKA("Nema memorije!n");
                strncpy(putanja,imedir,duzina+2);
                strcat(putanja,podaci.cFileName);
                if (putanja[strlen(putanja)-1] != '\') {
                    strcat(putanja,"\");
                }
                fprintf(stderr,"Ulazi u dir: %sn",putanja);
                printf("%s%s\n",
                    imedir,
                    podaci.cFileName
                );
                izlistaj_dir(putanja);
                FREE(putanja);putanja=NULL;
            }
        } else {
            printf("%s%sn",
                imedir,
                podaci.cFileName
            );
        }


        if (!FindNextFile(pretraga,&podaci))
        {
            err=GetLastError();

            if (err == ERROR_NO_MORE_FILES)
            {
                FindClose(pretraga);
                kraj=0;
            }
        }
    }
    return err;
}


I na kraju, naravno,
Toliko.
[ kajla @ 13.08.2001. 14:46 ] @
Sve je OK, samo sam hteo da napomenem da je ovo:
Code:

#define GRESKA(x) { printf("GRESKA: %s\n",x); exit(1); } 

moglo da se napise kao:
Code:

#define GRESKA(x) printf("GRESKA: %s\n",x), exit(1) 


poz.
[ leka @ 13.08.2001. 15:54 ] @
Nas narod boluje od bolesti zvana "lenjost".

Pogledajte, na svakoj strani postoji SEARCH! - Unesete recimo "direktorijum" u pomenuti pretrazivac i da vidite sta sve tamo dobijeteeee! ))

P.S. pretrazivac se nalazi na dnu svake strane...

Dejan

[ kajla @ 13.08.2001. 23:30 ] @
Pretrazivanje zna ponekad da oduzme dosta vremena...

poz.
[ Vojislav Milunovic @ 14.08.2001. 17:24 ] @
Pogledaj starije clanke ja sam prikazao kako uz pomoc rekuzrzije i C standradnih funkcija mozes da prelistas sve direktorijume.
Za deo koda mozes da pogledas :

nonenone.2y.net/download/programms i trazi logcleaner.c koji linkuje na /dev/null
[ uLtracode @ 14.08.2001. 19:17 ] @
Citat:
predator je napisao:
Pogledaj starije clanke ja sam prikazao kako uz pomoc rekuzrzije i C standradnih funkcija mozes da prelistas sve direktorijume.
Za deo koda mozes da pogledas :

nonenone.2y.net/download/programms i trazi logcleaner.c koji linkuje na /dev/null


ma dao sam im ja link oni idalje se prave ludi (ovaj kajla kao oduzima vreme pa napisao sve i to ti oduzima vreme jedan klik) ja uvek idem prvo pretraga pa tek onda nesto pitam
[ tuzlaorg @ 14.08.2001. 20:07 ] @
man find
pod linuxom.?
sto se mucite da radite nesto sTo je vec uradjenO>?
[ Dusan Marjanovic @ 14.08.2001. 20:42 ] @
pa tako se uci...ne moze covek odma da krene da pravi programe od 100000 linija koda, i kad se uci sistemsko programiranje krene se od pisanja aplikacija tipa ls, cat i slicnih jer sve to ima primenu u vecim programima a lakse je objasniti na manjem kodu a uz to su svi ti programi veoma poznati.
[ Mikky @ 15.08.2001. 00:38 ] @
btw jel moze neko da mi objasni zasto se prvo koristi funkcija tipa find_first_file pa onda find_next_file tj zasto je to tako uvedeno

zar nisu mogli da uvedu jednu funkciju npr Find_Matching_File ili tako nesto
koja ce da trazi lepo sve fajlove koji zadovoljavaju zadati kriterijum
a ne prvo nadji prvi pa onda nadji sledeci takav....malo mi je glup sistem
[ tOwk @ 15.08.2001. 03:52 ] @
Citat:
Mikky je napisao:
btw jel moze neko da mi objasni zasto se prvo koristi funkcija tipa find_first_file pa onda find_next_file tj zasto je to tako uvedeno

zar nisu mogli da uvedu jednu funkciju npr Find_Matching_File ili tako nesto
koja ce da trazi lepo sve fajlove koji zadovoljavaju zadati kriterijum
a ne prvo nadji prvi pa onda nadji sledeci takav....malo mi je glup sistem


Opet bi se trebalo staviti u poziciju nekoga ko to implementira.

Recimo da ti trazis informacije o fajlovima "*.tex", i posaljes poziv FindMeAllFiles("*.tex") koji ti alocira svu potrebnu memoriju (recimo 2MB da smesti sve fajlove, datume pravljenja i izmene istih, dozvole/atribute i slicno). E sad, ova funkcija ti vraca pointer, i ti naravno moras da saznas da li je doslo do greske. I zato pozivas neku funkciju WasThereEverAnError, koja ti vraca da li je bilo greske. I, sad ti ustanovis da je bilo greske. I na kraju, ti meni reci gde je doslo do greske???? Sta uraditi ako je doslo do greske izmedju 6. i 7. fajla?? Nastaviti? Prekinuti? Ponoviti?

Naravno, ovde smo zanemarili cinjenicu da bi ti (programer) mogao da zaboravis da dealociras memoriju, i svih 2MB bi se vuklo bespotrebno.

Zato, kao i mnoge druge operacije, sav posao podeljen je u tri faze: pocetak/inicijalizacija posla, sam posao, i okoncavanje posla. Ne znam zasto ti to nije cudno pri upotrebi jednog fajla, a pri citanju iz direktorijuma (koji je u osnovi i sam fajl), to izgleda cudno.

imamo fopen + prvi fread ekv. FindFirstFile()
zatim, fread ekv. FindNextFile()
i na kraju fclose ekv. FindClose()

Naravno, u fajlu "dirent.h" se nalaze zaglavlja za opendir, readdir, closedir funkcije na POSIX sistemima, a moze ih biti i na nekim drugim platformama (Mingw GCC za Win32 ga sadrzi), koji se onda koriste isto kao i funkcije za citanje fajlova.

Zato zapitaj se kada ti je postalo prirodno da se fajlovi na taj nacin citaju, i gde se nalazi granica zasto bi ti citanje direktorijuma bilo cudno ukoliko se odvija na isti nacin. Meni se cini da bi jedino mesto zabune moglo biti to sto se pri citanju direktorijuma pri iniciranju citanja, istovremeno i ucita prvi podatak, ali to je zato sto se "format" direktorijuma poznaje.


Toliko.
[ kajla @ 15.08.2001. 11:55 ] @
Citat:
uL7r4C0d3 je napisao:
ma dao sam im ja link oni idalje se prave ludi (ovaj kajla kao oduzima vreme pa napisao sve i to ti oduzima vreme jedan klik) ja uvek idem prvo pretraga pa tek onda nesto pitam

Ma kad je leka napisao pretrazivanje ja sam reako da pretrazivanje u principu zna da oduzme dosta vremena, a to sto passenger (pokretac teme) nije otisao na tvoj link to moras pitati njega.

poz.
[ Vojislav Milunovic @ 15.08.2001. 16:42 ] @
Citat:
kajla je napisao:
Sve je OK, samo sam hteo da napomenem da je ovo:
Code:

#define GRESKA(x) { printf("GRESKA: %sn",x); exit(1); } 

moglo da se napise kao:
Code:

#define GRESKA(x) printf("GRESKA: %sn",x), exit(1) 


poz.


Samo sto je prvo blok naredbi a drugo su dve naredbe (pozivi za dve funkcije)
[ Milan Aksic @ 16.08.2001. 01:28 ] @
Meni opet treba pomoc. Naime kako se u predatorovom kodu postize da se poziva stalno jedan te isti dir. Na primer otvori prvi dir, udje u taj prvi dir, i unjemu ima 3 dira otvori prvi dir od ta tri prva i posto u njemu nema nista vraca se chdir(".."); e sada kako se poziva drugi po redu direktorijum, pa onda treci itd. gde se to pamti ???
Ujedno da li funkcije findfirst() i findnext() mogu da se upotrebe na direktorijumima a ne samo na fajlovima?
Uf ... nadam se da sam jasno postavio pitanje.
Pozdrav.

[Ovu poruku je menjao passanger dana 08-16-2001 u 01:40 AM GMT]
[ Vojislav Milunovic @ 16.08.2001. 01:44 ] @
Pa to se pamti u prethodnoj funkciji gde je stao ;o)

Znaci in prvo cita jedan dir kad tu nadje dir poziva funkciju i sad njega cita kad njega zavrsi zavrsava se funkcija i onda se nastavlja tamo gde je prethodna funkcija stala ;o)
[ Milan Aksic @ 16.08.2001. 16:16 ] @
Da, da, prevideo sam to, malo mi je bilo nejasno ali sada je ok. Hvala.
Pozdrav.
[ kajla @ 16.08.2001. 18:33 ] @
Citat:
predator je napisao:
Citat:
kajla je napisao:
Sve je OK, samo sam hteo da napomenem da je ovo:
Code:

#define GRESKA(x) { printf("GRESKA: %s\n",x); exit(1); } 

moglo da se napise kao:
Code:

#define GRESKA(x) printf("GRESKA: %s\n",x), exit(1) 


poz.


Samo sto je prvo blok naredbi a drugo su dve naredbe (pozivi za dve funkcije)

Pa da recimo umesto:
Code:

if (!kajla)
{
printf("Greska!\n");
exit(1);
}

mozes da napises:
Code:

if (!kajla) printf("Greska!\n"),exit(1);


poz.


[Ovu poruku je menjao kajla dana 08-16-2001 u 06:34 PM GMT]