Könyvtárlistázás foldersfirst
2010-05-09T19:17:27+02:00
2010-05-09T22:23:29+02:00
2022-08-02T03:05:26+02:00
Péter01
szeretnék kilistázni egy könyvtárat, de úgy, hogy az abban a könyvtárban lévő könyvtárak legyenek elsőnek kilistázva és utána jöjjenek a fájlok. ehhez szeretnék kérni ötletet, esetleges kódokat, hogyan lehet megvalosítani?

ilyesmire gondoltam:
#include <map> #include <string> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> bool is_file(string n){ if(FILE*f=fopen(n.c_str(),"r")){ fclose(f); return 1; } return 0; } unsigned __int64 fsize(const char*c){ struct _stati64 s; if(_stati64(c,&s)==0){ if(s.st_size){ return s.st_size; } } return 0; } string fbyte(unsigned __int64 n){ int i=0; char b[100]; char*t[]={"K","M","G","T","P","E"}; if(n>1024){ double d; for(d=n;(int)d!=0;d/=1024.0,i++); snprintf(b,100,"%.2f",d*1024.0); }else{ snprintf(b,100,"%d",n*1); } string r=b; return r+" "+(n>1024?t[i-2]:"")+"B"; } string nam; unsigned __int64 siz; typedef map<string,string> strmap; strmap lst; DIR*opd=opendir("teszt_konyvtar"); while(dirent*red=readdir(opd)){ nam=red->d_name; siz=fsize(("teszt_konyvtar/"+nam).c_str()); // fájl neve és formázott mérete, könyvtár esetén üres lst[nam]=siz?fbyte(siz):(is_file("teszt_konyvtar/"+nam)?"0 B":""); } // fájlok és könyvtárak ABC sorrendben, vegyesen // ezt kéne rendezni // lst["alkonyvtar"]=""; // lst["film.avi"]="123"; // lst["ures_fajl"]="0"; // lst["videok"]=""; // fájlok és könyvtárak ABC sorrendben, könyvtárak elsőként // ilyenre // lst["alkonyvtar"]=""; // lst["videok"]=""; // lst["film.avi"]="123"; // lst["ures_fajl"]="0"; string ret; // itt pedig valahogy kilistázni, esetleg ennél jobb módszerrel for(map<string,string>::iterator ii=header.begin();ii!=header.end();ii++){ ret+="<a href="+(*ii).first+">"+(*ii).second+"</a><br>\n"; } //return ret;

rendezni kéne az strmap lst-t az éréke alapján.

vagy ha pl.:
typedef map<string,int> strmap; strmap lst; while(...){ lst[nam]=fsize(("teszt_konyvtar/"+nam).c_str()); }

és csak a return résznél formáznám le fbyte()-al akkor int értéket nem tudom, könnyebb-e rendezni?
Mutasd a teljes hozzászólást!
Az is jó, de mindenképp csinálj valami struct-ot az elemekből, csak a kulcs változzon mindig.

Itt egy list-es megoldás

struct SDirItem { enum EDirItemType { EV_Dir, EV_File }; static bool Compare(const SDirItem& p_item1, const SDirItem& p_item2) { return (p_item1.type < p_item2.type); } std::string name; EDirItemType type; unsigned size; }; SDirItem item1; item1.name = "foo"; item1.type = SDirItem::EV_File; item1.size = 1234; SDirItem item2; item2.name = "bar"; item2.type = SDirItem::EV_Dir; item2.size = 4567; std::list<SDirItem> dirList; dirList.push_back(item1); dirList.push_back(item2); for (std::list<SDirItem>::const_iterator it = dirList.begin(); it != dirList.end(); ++it) std::cout << (*it).name << std::endl; dirList.sort(SDirItem::Compare); std::cout << "-- sort --" << std::endl; for (std::list<SDirItem>::const_iterator it = dirList.begin(); it != dirList.end(); ++it) std::cout << (*it).name << std::endl;
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd