Prehladavanie adresarovej struktury – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Prehladavanie adresarovej struktury – C / C++ – Fórum – Programujte.comPrehladavanie adresarovej struktury – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Zajcev
~ Anonymní uživatel
30 příspěvků
15. 12. 2012   #1
-
0
-

Zdravim,

potreboval by som napisat funkciu ktora dostane ako parameter cestu k adresaru a potom tento adresar prehlada do hlbky. Vypise nazvy suborov  a podadresarov a tiez sa vnori do podadresara a pokracuje az dokym neprehlada cely adresarovy strom. Nakodil som nieco nasledovne :

#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

void adrr(char *);

int main(void)
{
    adrr("/");

    return 0;
}

void adrr(char * retazec)
{
    DIR * adr = opendir(retazec);

    if (adr == NULL)
    {
        printf("Chyba\n");

        //return 1;
    }

    struct dirent * xx ;
    struct stat test;

    xx = readdir(adr);

    while (xx != NULL)
    {
        xx = readdir(adr);
        int controll = 1;

        if (xx == NULL)
            break;

        if(strstr(xx->d_name, ".."))
        {
            controll = 0;
        }

        //printf("%s", xx->d_name);

        char * pt = malloc((sizeof(char) * strlen(xx->d_name)) + 2);

        strcpy(pt, retazec);
        strcat(pt, xx->d_name);

        printf("%s", pt);

        if (!(stat(pt, &test)) && (controll))
        {
           if (S_ISDIR(test.st_mode))
           {
               printf("\t-adresar\n");
               adrr(pt);

           }
           else
               printf("\n");

        }
        else
            printf("Chyba\n");


        free(pt);
    }
}

Nanestastie mi to padne pri behu programu. Niesom si isty ci som osetril spravne aby to nevychadzalo z adresara do jeho nadradeneho. Nejake napady kde som spravil chybu ? 

Dakujem za pripadnu pomoc.

Nahlásit jako SPAM
IP: 147.251.213.–
Reklama
Reklama
zlz
~ Anonymní uživatel
634 příspěvků
15. 12. 2012   #2
-
0
-

Když se nepovede opendir, tak dál pracuješ s neplatným adr.

Položku z prvního readdir vůbec nezpracuješ, protože hned na začátku cyklu máš další readdir.

Místo vyhledávání podřetězce (strstr) "..", použij porovnání celého řetezce (strcmp). A to pro "." i "..".

Ten controll vůbec nepotřebuješ a tak jak máš ten if-else napsaný ti to vypíše chybu ať už selže stat, nebo není nastavený controll. To asi nechceš.

Řetězec, do kterého skládáš celou cestu, alokuješ jen podle d_name. Celá cesta se ti do něj nevejde. A chybí ti tam oddělovač.

Nahlásit jako SPAM
IP: 80.188.216.–
Zajcev
~ Anonymní uživatel
30 příspěvků
15. 12. 2012   #3
-
0
-

Dik , ja som to potom prepisal na toto :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>

int prehladaj(char *);

int main()
{
    if (prehladaj("./"))
        return 1;

    return 0;
}

int prehladaj(char * dir_name)
{
    DIR * adresar = opendir(dir_name);
    //usleep(20000);
    if (adresar == NULL)
    {
        fprintf(stderr, "Nejde otvorit zadany adresar\n");

        return 1;
    }

    struct dirent * polozka_adresara = readdir(adresar);
    struct stat statbuffer;

    while (polozka_adresara != NULL)
    {
        char * cesta_suboru = calloc(100, sizeof(char));

        char * meno_nadradeneho = calloc(100, sizeof(char)); // meno nadradeneho adresara (adresar do ktoreho sme vstupili)

        if (!strcmp(dir_name, "./"))
        {
            strcpy(cesta_suboru, polozka_adresara->d_name);
        }
        else
        {
            strcat(cesta_suboru, dir_name);
            strcat(cesta_suboru, polozka_adresara->d_name);
        }

        if (stat(cesta_suboru, &statbuffer) == -1)
        {
            free(cesta_suboru);
            free(meno_nadradeneho);

            polozka_adresara = readdir(adresar);
            continue;
        }

        if (S_ISDIR(statbuffer.st_mode))
        {
            if (strcmp(polozka_adresara->d_name, "..") && strcmp(polozka_adresara->d_name, "."))
            {
                strcpy(meno_nadradeneho, polozka_adresara->d_name);
                strcat(meno_nadradeneho, "/");

                printf("%s\n", cesta_suboru);
                printf("\n\n\n\n\n-----%s-----\n\n\n\n", cesta_suboru);
                prehladaj(meno_nadradeneho);
            }
        }
        else
            printf("%s\n", cesta_suboru);

        polozka_adresara = readdir(adresar);

        free(cesta_suboru);
        free(meno_nadradeneho);
    }

    return 0;
}

Neviem si ale rady stym, ze mi to funguje len do maximalne druheho vnorenia ... Problem vidim na riadku 66, konkretne mu pri dalsom vnoreni predavam zly argument (zlu cestu). Neviem si stym bohuzial dat rady. Nejake napady jak to opravit aby to vypisovali korektne celu adresarovu strukturu ?

Dakujem za pomoc.

Nahlásit jako SPAM
IP: 147.251.213.–
Radek Chalupa
~ Redaktor
0
Super člen
15. 12. 2012   #4
-
0
-

#3 Zajcev
Sice tuším že to asi má být buď přímo pro Linux nebo multiplatformní, ale pokud náhodou je to ve Windows tak můžeš použít API funkce FindFirstFile a FindNextFile plus využití rekurzivního volání funkcí v céčku.

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
zlz
~ Anonymní uživatel
634 příspěvků
15. 12. 2012   #5
-
0
-

Celá cesta je stejná ať jde o soubor, který jen vypíšeš, nebo adresář, do kterého vstoupíš. Takže nepotřebuješ dva stringy a rozhodně nebudou mít úplně jiný obsah. A 100 znaků nemusí stačit, měl bys alokovat tolik, kolik opravdu potřebuješ.

A ten readdir můžeš dát rovnou do podmínky while, ať to uvnitř nemusíš hlídat (před tím continue a na konci bloku).

while ((polozka_adresara = readdir(adresar)) != NULL)
Nahlásit jako SPAM
IP: 80.188.216.–
Zajcev
~ Anonymní uživatel
30 příspěvků
16. 12. 2012   #6
-
0
-

Tak uz to prehlada celu adresarovu strukturu (vnorene zlozky ...)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>

int prehladaj(char *);

int main()
{
    if (prehladaj("./"))
        return 1;

    return 0;
}

int prehladaj(char * dir_name)
{
    DIR * adresar = opendir(dir_name);
    //usleep(20000);
    if (adresar == NULL)
    {
        fprintf(stderr, "Nejde otvorit zadany adresar\n");

        return 1;
    }

    struct dirent * polozka_adresara = readdir(adresar);
    struct stat statbuffer;

    while (polozka_adresara != NULL)
    {
        char * cesta_suboru = calloc(100, sizeof(char));

        char * meno_nadradeneho = calloc(100, sizeof(char)); // meno nadradeneho adresara (adresar do ktoreho sme vstupili)

        if (!strcmp(dir_name, "./"))
            strcpy(cesta_suboru, polozka_adresara->d_name);
        else
        {
            strcat(cesta_suboru, dir_name);
            strcat(cesta_suboru, "/");
            strcat(cesta_suboru, polozka_adresara->d_name);

        }

        if (stat(cesta_suboru, &statbuffer) == -1)
        {
            free(cesta_suboru);
            free(meno_nadradeneho);

            polozka_adresara = readdir(adresar);
            continue;
        }

        if (S_ISDIR(statbuffer.st_mode))
        {
            if (strcmp(polozka_adresara->d_name, "..") && strcmp(polozka_adresara->d_name, "."))
            {
                printf("%s\n", cesta_suboru);
                //printf("\n\n\n\n\n-----%s-----\n\n\n\n", strcpy(cesta_suboru, meno_nadradeneho));
                prehladaj(cesta_suboru);
            }
        }
        else
            printf("%s\n", cesta_suboru);

        polozka_adresara = readdir(adresar);

        free(cesta_suboru);
        free(meno_nadradeneho);
    }

    closedir(adresar);

    return 0;
}

Este by som potreboval aby to najprv vypisalo len subory a zlozky v aktualnom adresari. Proste aby sa to nevnorovalo hned jak najde novy adresar. Nejake napady ajk to docielit ?

Dik za pomoc.

Nahlásit jako SPAM
IP: 147.251.213.–
Zajcev
~ Anonymní uživatel
30 příspěvků
16. 12. 2012   #7
-
0
-

Vyriesene.

Nahlásit jako SPAM
IP: 147.251.213.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 78 hostů

Podobná vlákna

Prehľadávanie siete — založil mimi

Prehľadávanie zložky [PHP] — založil Tocimanko

Struktury v C++ — založil pin2k

Struktury — založil RePRO

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý