?
Nein, ich programmiere unter Linux. dirent ist da bekannt.
Ich hab die static_casts jetzt weggemacht und string(entry->d_name)
geschrieben.
Ich hab mal gelesen, dass man für die explizite Typenumwandlung, die
casts verwenden soll, die wären besser.
Meine Absicht mit dem Verzeichnis lesen ist folgende.
Ich gebe einen zentralen Pfad an. In diesem Pfad befinden sich weitere
Ordner, die ich nacheinander öffnen will, und nach 3 Dateien durchsuchen will.
Eine mit ".bmb", eine mit ".mpg" und eine mit ".png" als Endung.
Die bmb-Datei will ich öffnen, die ist im Textformat. Anhand dieser Datei
erstell ich ein Objekt, dem ich die Daten aus der Datei übergebe. And das
Objekt soll auch der vollständige Dateiname der mpg- und png-Datei übergeben
werden, die jedoch ohne vollständige Pfadangabe, nur den Dateinamen.
Und dieses Objekt wird dann in einer STL-Liste gespeichert.
Ich habe dazu o. g. Listing ineinander verschachtelt. Zuerst wird der erste
Ordner des Basisverzeichnisses gelesen, dieser Name wird dann übergeben.
Dann wird das innere Verzeichnis gelesen, und festgestellt, ob sich da drin
die gewünschten Files befinden.
bool BombDir::readBombDir()
{
AllBombsList->clear();
DIR *outerHdir,*innerHdir;
struct dirent *outerEntry,*innerEntry;
string Bombentry;
unsigned int ListPos=0;
//Read base directory
outerHdir=opendir(BombPath.c_str());
do
{
outerEntry=readdir(outerHdir);
if(outerEntry && string(outerEntry->d_name)!="." && string(outerEntry->d_name)!="..")
{
Bombentry=BombPath+"/"+outerEntry->d_name;
//Read bombentry
innerHdir=opendir(Bombentry.c_str());
do
{
innerEntry=readdir(innerHdir);
//Overread dots and search for bmb-file
if(innerEntry && string(innerEntry->d_name)!="." && string(innerEntry->d_name)!=".." && strstr(string(innerEntry->d_name).c_str(),".bmb"))
{
ListPos++;
//Open bmb-file
fstream BombFile;
//Build path
string BombFilePath=BombPath+"/"+outerEntry->d_name+"/"+innerEntry->d_name;
string temp1;
unsigned int temp2;
BombFile.open(BombFilePath.c_str(),ios_base::in);
if(BombFile)
{
//Create a temporary Bomb object
Bomb* tempBomb=new Bomb;
//Read data from file and set temporary bomb
getline(BombFile,temp1);
tempBomb->setBombId(temp1);
getline(BombFile,temp1);
tempBomb->setBombName(temp1);
getline(BombFile,temp1);
tempBomb->setBombColour(temp1);
BombFile>>temp2;
tempBomb->setBombSize(temp2);
BombFile>>temp2;
tempBomb->setBombRaiseTime(temp2);
BombFile>>temp2;
tempBomb->setBombClimbHeight(temp2);
BombFile>>temp2;
tempBomb->setBombExplodeTime(temp2);
//Overread newline
getline(BombFile,temp1);
getline(BombFile,temp1);
tempBomb->setBombPicture(temp1);
getline(BombFile,temp1);
tempBomb->setBombMovie(temp1);
//Call function to add bomb entry
AddBombEntry(tempBomb,ListPos);
delete tempBomb;
BombFile.close();
}
}
//Search for mpg
if(innerEntry && string(innerEntry->d_name)!="." && string(innerEntry->d_name)!=".." && strstr(string(innerEntry->d_name).c_str(),".mpg"))
{
std::cout<<innerEntry->d_name<<"\n";//Wird noch verarbeitet
}
//Search for png
if(innerEntry && string(innerEntry->d_name)!="." && string(innerEntry->d_name)!=".." && strstr(string(innerEntry->d_name).c_str(),".png"))
{
std::cout<<innerEntry->d_name<<"\n";//Wird noch verarbeitet
}
}
while(innerEntry);
closedir(innerHdir);
}
}
while(outerEntry);
closedir(outerHdir);
}
void BombDir::MoveIter(unsigned int _Pos)
{
Iter=AllBombsList->begin();
for(unsigned int PosCount=1;PosCount!=_Pos;PosCount++)
{
Iter++;
}
return;
}
Die unterste Methode soll den Iterator der Liste bewegen. Die hab ich
gekapselt, da ich sie in dieser Klasse noch öfter brauchen werde.
Die add-Methode usw. muss ich noch schreiben.
Hier noch meine Deklaration, aber es ist noch nicht ganz fertig:
#include<dirent.h>
#include<list>
#include"bomb.h"
typedef std::list<Bomb>BombDirList;
class BombDir
{
public:
BombDir(std::string _BombPath):BombPath(_BombPath)
{
AllBombsList=new BombDirList;
}
~BombDir()
{
delete AllBombsList;
}
bool readBombDir();
// bool delBombDir(std::string _DirName);
// list* getBombDir()
private:
BombDir()
{}
std::string BombPath;
BombDirList* AllBombsList;
BombDirList::iterator Iter;
void MoveIter(unsigned int);
};
Ist vielleicht alles etwas unschön oder umständlich realisiert, aber wie
gesagt, ich bin noch Anfänger.
Ich krieg erst so nach und nach ein Bild davon, was mir in der Standard-
bibliothek so alles zur Verfügung steht.
Ich hab jetzt direkt schon ein grösseres Projekt angefangen, und in dieser
Zeit schon alles einigemale umgekrempelt, weil ich feststellen musste, dass
ich das Rad neu erfunden habe. An lebenden Objekten lernt man doch am besten,
oder etwa nicht?