C++ and design Pattern (Composite design Pattern )
HI All
i am new to C++ and design Pattern ... while implementing Composite
design Pattern
Facing Issue. Kindly help me Out.
[root@arnav test]# cat Filesystem.cc
# include <iostream>
# include <vector>
# include <string.h>
# include <sstream>
# include <ctime>
using namespace std;
#define PORTAGE_DIR "/home/test/"
# include <stdio.h>
#include <stdlib.h>
# include <dirent.h>
# include <sys/types.h>
# include <sys/stat.h>
///////////////////////////////////////////////////////
class Directory;
class AbsFile {
string name;
class Directory* parent;
protected:
Directory* getParent() { return parent; }
public:
AbsFile( string n, Directory* p ) : name( n ) { parent = p; }
virtual ~AbsFile() { }
string getName() { return name; }
virtual void fileSystemCrawler ( string = "" ) = 0;
};
////////////////////////////////////////////////////////////////////
class File : public AbsFile {
stringstream content;
public:
File(string n, Directory * p) : AbsFile(n , p){ }
~File() { }
/*virtual*/
void fileSystemCrawler( string s = "") {
struct stat crawl_stat;
s = getName();
if (s == "" || s == ".." || s ==".")
return ;
if (stat(s.c_str(), &crawl_stat) == 0 ) {
cout<< " Filename " << s << " " << crawl_stat.st_size <<
endl;
}
}
};
////////////////////////////////////////////////////////////////////////////
class Directory : public AbsFile {
string name;
public:
Directory (string n, Directory * p = 0) : AbsFile(n, p) {
}
~Directory() {
}
//////////////////////////////////////////////////////////////////////////
int isdir(struct dirent **check_dirent) {
struct stat check_stat = {0};
if ( stat((*check_dirent)->d_name, &check_stat) == 0 ) {
if( S_ISDIR(check_stat.st_mode) != 0 ) {
if( strcmp( (*check_dirent)->d_name , "." ) != 0 ) {
if( strcmp( (*check_dirent)->d_name , ".." ) != 0 ) {
return 0;
}
}
}
}
return 1;
}
//////////////////////////////////////////////////////////////////////////
/*virtual*/
void fileSystemCrawler ( string s = "" ) {
/* Holds info for the main portage directory. */
DIR *master;
struct dirent *master_dirent;
struct stat master_stat;
/* Holds info for the crawler which goes in every category
folder. */
DIR *crawl;
struct dirent *crawl_dirent;
struct stat crawl_stat = {0};
s = getName();
if (chdir(s.c_str()) != 0)
cout << "chdir() failed" << endl;
system ("pwd");
if ((master = opendir(s.c_str())) == (DIR *)0)
cout << " opendir failed" << endl;
if (s == "" || s == ".." || s ==".")
return ;
if (stat(s.c_str(), &crawl_stat) == 0 ) {
cout<< " Directory " << s << " " << crawl_stat.st_size <<
endl;
}
while((master_dirent = readdir(master)) != 0 ) {
if (stat(master_dirent->d_name, &master_stat) == 0 ) {
string str = master_dirent->d_name;
if (isdir(&master_dirent) == 0)
{
Directory * ptr = new Directory (str,
getParent());
ptr->fileSystemCrawler(str);
delete ptr;
chdir("..");
} else {
File * ptr = new File(str, getParent());
ptr->fileSystemCrawler(str);
delete ptr;
}
}
}
closedir(master);
}
};
Directory* initialize() {
Directory* root = new Directory( "/home/test/" );
return root;
}
//////////////////////////////////////////////////////////////
int main( void ) {
////////// Composite, Proxy //////////
Directory* root = initialize();
root->fileSystemCrawler(); cout << '\n';
delete root; cout << '\n';
return 0;
}
===================================================
[root@arnav test]#
[root@arnav test]#
[root@arnav test]# ls
a.out Backup.cc Backup_File.cc Filesystem.cc intermediate.cc
test1 test2 test3
[root@arnav test]# ./a.out
/home/test
Directory /home/test/ 4096
Filename a.out 44683
Filename Backup_File.cc 5015
Filename Backup.cc 5027
/home/test/test2
opendir failed
Segmentation fault (core dumped)
[root@arnav test]#
Thanks
Pallav Singh