#include <dirent.h>
#include <stdio.h>
#include <iostream>
#include <ctime>
#include <string>
#include <unistd.h>
#include <stdio.h>
#include <cstring>
#include <vector>
#include <sys/stat.h>
#include <stdlib.h>
using namespace std;
class directories
{
string presentDir;
vector<string> dirToCheck;
bool checkAll;
public:
directories()
{
checkAll=0;
string startPoint;
cout<<"Whats your start point? example:1) \"/\" 2) \"/piotr\""<<endl;
cin>>startPoint;
cout<<endl;
dirToCheck.push_back(startPoint);
}
~directories()
{
;
}
bool isSearchDone();
bool canSearch();
string searchPos();
void addDir(string newDir);
};
bool directories::isSearchDone()
{
return(!checkAll);
}
bool directories::canSearch()
{
if (dirToCheck.empty())
{
checkAll=1;
return(0);
}
else
{
presentDir=dirToCheck[dirToCheck.size()-1];
//cout<<system(("file '"+presentDir+"'").c_str())<<endl;
//cout<<presentDir<<endl;
dirToCheck.pop_back();
//cout<<dirToCheck.size()<<endl;
return(1);
}
}
string directories::searchPos()
{
return(presentDir);
}
void directories::addDir(string newDir)
{
dirToCheck.push_back(newDir);
}
int main()
{
DIR *dir;
struct dirent *dp;
struct stat statbuf;
string strFile, findName;
cout<<"what are you searching for?"<<endl;
cin>>findName;
cout<<endl<<"Found:"<<endl;
directories doSearch;
while(doSearch.isSearchDone())
{
if(doSearch.canSearch())
{
dir= opendir(doSearch.searchPos().c_str());
while ((dp = readdir(dir))!=NULL)
{
strFile=dp->d_name;
int pos = strFile.find(findName);
if (pos!=(string::npos))
{
if(doSearch.searchPos()=="/")
{
printf("%s\n",(doSearch.searchPos()+strFile).c_str());
}
else
{
printf("%s\n",(doSearch.searchPos()+"/"+strFile).c_str());
}
}
if ((strFile!=".")&&(strFile!="..")&&(strFile!="proc")&&(strFile!="sys")&&(strFile!="dev")&&(strFile!="Trash"))
{
if(doSearch.searchPos()=="/")
{
stat((doSearch.searchPos()+strFile).c_str(),&statbuf);
}
else
{
stat((doSearch.searchPos()+"/"+strFile).c_str(),&statbuf);
}
//cout<<stat(dp->d_name,&statbuf)<<endl;
////////////////////////////////////// PROBLEM /////////////////////////////////////////////
//cout<<S_ISDIR(statbuf.st_mode); // it says its zero tho its a directory wth??? (similary build program works)
if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
{
if(doSearch.searchPos()=="/")
{
doSearch.addDir(doSearch.searchPos()+strFile);
}
else
{
doSearch.addDir(doSearch.searchPos()+"/"+strFile);
}
}
}
}
closedir(dir);
}
}
cout<<endl;
}