[gameprogrammer] Re: Linux _findfirst equivalent

Thanks, that is very kind of you.

Enrico Zschemisch wrote:
Hi,

sorry for the delay, I had exams the last two weeks and now some holidays. Attached you can find the request method. I had to guess the FileList class and the hash stuff is missing. Source is tested on Debian testing with G++-4 and should work on every Unix/Linux.
Feel free to request more features or ask questions :-)


Greetings, Enrico


------------------------------------------------------------------------

#include <string>
#include <vector>
#include <iostream>
#include <sstream>

#include <sys/stat.h>
#include <fts.h>

using std::string; using std::cout; using std::endl;
using std::vector;

class FileList
{
public:
FileList() {}
~FileList()
{
m_vFiles.clear();
}
void AddFilesFromDirectory(const char *applicationDirectory, const char *subDirectory, bool writeHashInsteadOfData);

void Dump(void)
{
vector<FileEntry>::iterator filename = m_vFiles.begin();

cout << "File List: " << endl;
for(; filename != m_vFiles.end(); filename++)
{
cout << "\tFilename: " << (*filename).name << " Size: " << (*filename).size << "Byte" << endl;
}
}


        void AddFile(const std::string &filename, const char *data, const 
size_t DataSize, const size_t FileSize)
        {
                FileEntry entry;
                entry.name = filename;
                entry.size = FileSize;
                m_vFiles.push_back(entry);
        }
private:
        typedef struct sFileEntry
        {
                string name;
                size_t size;
        } FileEntry;
        vector<FileEntry> m_vFiles;
};

void FileList::AddFilesFromDirectory(const char *applicationDirectory, const char *subDirectory, bool writeHashInsteadOfData)
{
// C++ strings make handling much easier
std::string RootDirectory = "./";
if(NULL != applicationDirectory)
{
RootDirectory = applicationDirectory;
}
// Make sure the path is finished with a slash
if('/' != RootDirectory[RootDirectory.length()-1])
{
RootDirectory.append("/");
}

if(NULL != subDirectory)
{
RootDirectory += subDirectory;
}

// Make sure the path is finished with a slash
// have to do this again, because "subDirectory" might be without slash
if('/' != RootDirectory[RootDirectory.length()-1])
{
RootDirectory.append("/");
}

char *DirectoryList[] = { (char*)RootDirectory.c_str(), NULL };

// Don't set FTS_NOSTAT or you won't get filesize so easily!
FTS *fts = fts_open(DirectoryList, FTS_LOGICAL, NULL);

if(NULL != fts)
{
FTSENT *entry = NULL;
while((entry = fts_read(fts)) != NULL)
{
if(entry->fts_info & FTS_F)
{
const string Filename = entry->fts_path; // includes path+filename
const size_t Filesize = entry->fts_statp->st_size; // size in bytes
// filter out hidden files
if(Filename.length() > 0 && entry->fts_namelen > 0 && '.' != entry->fts_name[0])
{
// This is not exactly what Kevin needs, need to talk to him
if(true == writeHashInsteadOfData)
{
// calculate hash value here
}
else
{
this->AddFile(Filename, NULL, Filesize, Filesize);
}
}
}
} }
else
{
// mhm, some error handling should go here!
cout << "No FTS!" << endl;
}

fts_close(fts);
}


int main(int argc, char **argv)
{
        FileList list;
        if(1 == argc)
        {
                list.AddFilesFromDirectory("/home/enrico/", "Desktop/", false);
        }
        else
        {
                list.AddFilesFromDirectory(argv[1], "", false);
        }
        
        list.Dump();
        
        return 0;
}


---------------------
To unsubscribe go to http://gameprogrammer.com/mailinglist.html


Other related posts: