Hi guys,
Im working on a small console app to seek out all those pesky and disk consuming .ncb files and debug folders left from VS and destroy them so the space i need to backup the files is considerably reduced.
I have got my recusrion algorithm to scan as deep as it needs to (seems to be working fine) But the issue is when i want to delete the files. I have a function that worked fine when i passed a path refrence to it, but to get recusrion i changed over to directory iterators. Using these i now get the final else case of my check function when deleting which now insists the files are neither directories or regulor files.
I cant seem to figure out after many hours toiling to find what is causing this. So if anyone could give this code a review and maybe help me out id really appreciate it. Code follows.
void scanDir(const path& dir, int numLevels)
{
try //might get exceptions so catch them
{
if(!exists(dir) || !is_directory(dir)) //check path is valid and is a directory
{
std::cout<<"Invalid input.\n";
exit(-1);
}
for(directory_iterator dir_iter(dir), dir_end;dir_iter != dir_end; ++dir_iter)
{
if(is_directory(dir_iter->path().leaf()))//if this is another directory dig down and look
{
cout<<padd(numLevels)<<"<DIR>"<<dir_iter->path().leaf()<<endl;
if(checkAndRemove(dir_iter->path().leaf(),BAD_TYPES))
continue; //if i deleted the folder i dont want to try look into it
scanDir(dir_iter->path().leaf(), numLevels+1);
}
else //this is just a file so print it
{
cout<<padd(numLevels)<<dir_iter->path().leaf()<<endl;
checkAndRemove(dir_iter->path().leaf(),BAD_TYPES);
}
}
std::cout<<padd(numLevels)<<"End of Folder"<<endl;
}
catch (const filesystem_error& ex)
{
cout << ex.what() << '\n';
}
}
bool checkAndRemove(path& file, const vector<string> &unwantedTypes)
{
vector<string>::const_iterator result;
result = find(unwantedTypes.begin(),unwantedTypes.end(),file.extension());
if(result!=unwantedTypes.end())
{
//check if its a file or directory
if(is_directory(file))
{
cout<<"removing directory:"<<file.filename()<<endl;
remove_all(file);
folderCount++;
}
else if(is_regular_file(file))
{
cout<<"Removing file: "<<file.filename()<<endl;
remove(file.c_str());
fileCount++;
}
else
{
cout<<"Object is not a file or directory"<<endl;
}
return true;
}
return false;
}
Again many thanks in advance, if anything is unclear ill try to explian but as im new to boost im still quite shaky on my understanding of it.