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. :)
Fórum › C / C++
Jak získat cesty k souborům na disku/ve složce?
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. :)
#6 richard.zavodny
https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx
dokumentace je trochu neprehledna ale staci pak srovnat: info.st_mode == _S_IFDIR
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ář.
#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;
}
#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";
}
}
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. :)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Relativní cesty k souborům — založil Taxmi
Jak ziskat checkboxy — založil Gibon
Jak ziskat udaj z internetu ? — založil dyžon
VB - Jak získat název aplikace — založil Denoy
Jak získat praxi a učit se v IT — založil Radek Hlaváček
Moderátoři diskuze