Sadece paylaşmak istediğim bir şey ve okuma materyali için teşekkür ederim. Biraz anlamak için fonksiyon ile oynayın. Hoşuna gidebilir. e uzatma için durdu, p yol için ve s yol ayırıcı için.
Yol, ayırıcıyı sonlandırmadan geçirilirse, yola bir ayırıcı eklenir. Uzantı için boş bir dize girilirse, işlev adında uzantısı olmayan herhangi bir dosyayı döndürür. Tek bir yıldız girildiyse, dizindeki tüm dosyalar döndürülür. E uzunluğu 0'dan büyükse, ancak tek bir * değilse, e sıfır konumunda bir nokta içermiyorsa bir nokta e'nin başına eklenir.
Dönen bir değer için. Sıfır uzunluklu bir harita döndürülürse, dizin bulunamadı ama hiçbir şey bulunamadı. 999 dizini dönüş değerinden elde edilebilir, ancak harita boyutu yalnızca 1 ise, dizin yolunun açılmasıyla ilgili bir sorun olduğu anlamına gelir.
Verimlilik için bu işlevin 3 küçük işleve ayrılabileceğini unutmayın. Bunun da ötesinde, girdiye bağlı olarak hangi işlevi arayacağını algılayacak bir arayan işlevi oluşturabilirsiniz. Bu neden daha verimli? Bir dosya olan her şeyi yakalayacaksanız, bu yöntemi tüm dosyaları kapmak için oluşturulan alt işlevi yapmak, sadece dosya olan her şeyi yakalayacak ve bir dosya bulduğunda başka bir gereksiz koşulu değerlendirmek zorunda kalmayacağını söyledi.
Bu, uzantısı olmayan dosyaları yakaladığınızda da geçerlidir. Bu amaçla oluşturulmuş belirli bir işlev, yalnızca bulunan nesnenin bir dosya olması ve ardından dosya adının içinde bir nokta olup olmadığına ilişkin hava durumunu değerlendirir.
Yalnızca çok fazla dosyaya sahip olmayan dizinleri okursanız kaydetme çok fazla olmayabilir. Ancak, büyük miktarda dizin okuyorsanız veya dizinde birkaç yüz binlerce dosya varsa, büyük bir tasarruf olabilir.
#include <stdio.h>
#include <sys/stat.h>
#include <iostream>
#include <dirent.h>
#include <map>
std::map<int, std::string> getFile(std::string p, std::string e = "", unsigned char s = '/'){
if ( p.size() > 0 ){
if (p.back() != s) p += s;
}
if ( e.size() > 0 ){
if ( e.at(0) != '.' && !(e.size() == 1 && e.at(0) == '*') ) e = "." + e;
}
DIR *dir;
struct dirent *ent;
struct stat sb;
std::map<int, std::string> r = {{999, "FAILED"}};
std::string temp;
int f = 0;
bool fd;
if ( (dir = opendir(p.c_str())) != NULL ){
r.erase (999);
while ((ent = readdir (dir)) != NULL){
temp = ent->d_name;
fd = temp.find(".") != std::string::npos? true : false;
temp = p + temp;
if (stat(temp.c_str(), &sb) == 0 && S_ISREG(sb.st_mode)){
if ( e.size() == 1 && e.at(0) == '*' ){
r[f] = temp;
f++;
} else {
if (e.size() == 0){
if ( fd == false ){
r[f] = temp;
f++;
}
continue;
}
if (e.size() > temp.size()) continue;
if ( temp.substr(temp.size() - e.size()) == e ){
r[f] = temp;
f++;
}
}
}
}
closedir(dir);
return r;
} else {
return r;
}
}
void printMap(auto &m){
for (const auto &p : m) {
std::cout << "m[" << p.first << "] = " << p.second << std::endl;
}
}
int main(){
std::map<int, std::string> k = getFile("./", "");
printMap(k);
return 0;
}