Jak získat cesty k souborům na disku/ve složce? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak získat cesty k souborům na disku/ve složce? – C / C++ – Fórum – Programujte.comJak získat cesty k souborům na disku/ve složce? – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
richard.zavodny0
Návštěvník
25. 11. 2016   #1
-
0
-

Ahoj, potřebuju napsat program, který mi projde celý disk/složku, kterou mu zadám a vypíše cesty (a názvy) k jednotlivým souborům. Jak by jste toto řešili vy? Nějak mě totiž nenapadá žádné řešení a ani strýček Google moc nepomohl. :/

Díky. :)

Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
BDS+3
Věrný člen
25. 11. 2016   #2
-
0
-

#1 richard.zavodny
já bych to řešil přes FindFirstFile/FindNextFile

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
richard.zavodny0
Návštěvník
26. 11. 2016   #3
-
0
-

#2 BDS
Díky za odpověď, ale jelikož příliš neholdouji Windows, tak toto asi neklapne. Každopádně díky. :)

Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
richard.zavodny0
Návštěvník
26. 11. 2016   #4
-
0
-

Tak jsem "zkuchtil" něco pomocí dirent.h knihovny, ale má přání to nenaplňuje. Projede to jenom aktuální adresář, avšak nemám zdání, jakým způsobem projedu celou adresářovou strukturu tohoto adresáře.

Chtěl bych mít, výstup podobný tady tomuto:

/soubor1.txt
/soubor2.pdf
/soubor3.php
/soubor4.css
/slozka1/soubor5.txt
/slozka1/soubor6.pdf
/slozka1/slozka2/soubor7.php
/slozka1/slozka2/soubor8.css
/slozka1/slozka2/soubor9.js
...
...
...


Můj kód:

#include <iostream>
#include <dirent.h>

using namespace std;

int main() {
    DIR *directory = NULL;
    struct dirent *dirent = NULL;

    directory = opendir("./");

    if(directory) {

        while(dirent = readdir(directory)) {
            cout << dirent->d_name << "\n";
        }

        closedir(directory);

    } else {

        cout << "Directory can't be opened.\n";

    }
}


Díky. :)

Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
KIIV
~ Moderátor
+43
God of flame
26. 11. 2016   #5
-
0
-

#4 richard.zavodny
musis pouzit bud rekurzi nebo si adresare vkladat do fronty a pak to zpracovavat dokud tam neco je...

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
richard.zavodny0
Návštěvník
26. 11. 2016   #6
-
0
-

#5 KIIV
Dobrá, ještě další otázka.. Jak zjistit, zda se jedná o adresář a ne soubor?

Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
KIIV
~ Moderátor
+43
God of flame
26. 11. 2016   #7
-
0
-
Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondra.holub+1
Stálý člen
26. 11. 2016   #8
-
0
-

Ještě nezapomeň kontrolovat symlinky. Bez toho by se ti mohlo stát, že se ti program zacyklí donekonečna, protože symlink může odkazovat třeba na svůj rodičovský adresář.

Nahlásit jako SPAM
IP: 212.96.189.–
richard.zavodny0
Návštěvník
26. 11. 2016   #9
-
0
-

#8 ondra.holub
No, to je právě problém, který řeším a absolutně nemám zdání, jak na to.. :/

Můj kód:

#include <iostream>
#include <dirent.h>

using namespace std;

void findFiles(char *directoryName) {
    DIR *directory = NULL;
    struct dirent *dirent = NULL;

    directory = opendir(directoryName);

    if(directory) {
        while(dirent = readdir(directory)) {
            if(dirent->d_type == 0x8) {
                cout << "/" << directoryName << "/" << dirent->d_name << "\n";
            } else {
                findFiles(dirent->d_name);
            }
        }

        closedir(directory);
    } else {
        cout << "Can't open directory: " << directoryName << "\n";
    }
}

int main() {
    findFiles(".");

    return 0;
}
Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
ondra.holub+1
Stálý člen
26. 11. 2016   #10
-
0
-

#9 richard.zavodny
Zkus man lstat, tam hledej st_mode a S_IFLNK

Nahlásit jako SPAM
IP: 212.96.189.–
Řešení
gna
~ Anonymní uživatel
1850 příspěvků
26. 11. 2016   #11
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

#9 richard.zavodny
Zacyklí se ti to, protože procházíš i "." (aktuální adresář) a ".." (nadřazený adresář).

void findFiles(const string & directoryName) {
    DIR *directory = NULL;
    struct dirent *dirent = NULL;
    string entryName;

    directory = opendir(directoryName.c_str());

    if (directory) {
        while (dirent = readdir(directory)) {
            entryName = dirent->d_name;

            if (entryName == "." || entryName == "..") {
                continue;
            }

            cout << directoryName << "/" << entryName << "\n";

            if (dirent->d_type == DT_DIR){
                findFiles(directoryName + "/" + entryName);
            }
        }

        closedir(directory);
    } else {
        cout << "Can't open directory: " << directoryName << "\n";
    }
}
Nahlásit jako SPAM
IP: 213.211.51.–
richard.zavodny0
Návštěvník
27. 11. 2016   #12
-
0
-

Díky moc, všem. Už to funguje podle mého zdání. :)

Kdyby někdo hledal to co já, tak tady je celý kód:

#include <iostream>
#include <dirent.h>

using namespace std;

void findFiles(const string & directoryName) {
    DIR *directory = NULL;
    struct dirent *dirent = NULL;
    string entryName;

    directory = opendir(directoryName.c_str());

    if(directory) {
        while(dirent = readdir(directory)) {
            entryName = dirent->d_name;

            if(entryName == "." || entryName == "..") {
                continue;
            } else {
                if(dirent->d_type == 0x8) {
                    cout << directoryName << "/" << entryName << "\n";
                } else {
                    findFiles(directoryName + "/" + entryName);
                }
            }
        }

        closedir(directory);
    } else {
        cout << "Can't open directory: " << directoryName << "\n";
    }
}

int main() {
    findFiles(".");

    return 0;
}


Ještě jednou díky, všem. :)

Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
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, 13 hostů

Podobná vlákna

Jak ziskat checkboxy — založil Gibon

Jak získat praxi a učit se v IT — založil Radek Hlaváček

Moderátoři diskuze

 

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