Initial Commit
This commit is contained in:
commit
4d64652686
22
FileWrapper.h
Normal file
22
FileWrapper.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
#pragma once
|
||||
#include <string>
|
||||
#include <functional>
|
||||
|
||||
class DirWalk
|
||||
{
|
||||
public:
|
||||
DirWalk(const std::string& DirName);
|
||||
~DirWalk();
|
||||
// noncopyable, nonmovable.
|
||||
DirWalk(const DirWalk&) = delete;
|
||||
DirWalk& operator = (const DirWalk&) = delete;
|
||||
DirWalk(DirWalk&&) = delete;
|
||||
DirWalk& operator = (DirWalk&&) = delete;
|
||||
|
||||
bool isReady() const;
|
||||
int next(std::string& name, bool& is_dir);
|
||||
std::string getroot() const;
|
||||
private:
|
||||
struct _impl;
|
||||
_impl* _p;
|
||||
};
|
77
FileWrapper_Lin.cpp
Normal file
77
FileWrapper_Lin.cpp
Normal file
|
@ -0,0 +1,77 @@
|
|||
#ifndef _WIN32
|
||||
#include <dirent.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <cstdlib>
|
||||
|
||||
struct DirWalk::_impl
|
||||
{
|
||||
DIR* dir;
|
||||
std::string root;
|
||||
};
|
||||
|
||||
DirWalk::DirWalk(const std::string& DirName)
|
||||
{
|
||||
std::string realname = DirName;
|
||||
int sz = realname.size();
|
||||
if (realname[sz-1] != '/')
|
||||
{
|
||||
realname.push_back('/');
|
||||
}
|
||||
if ((_p->dir = opendir(realname .c_str())) != NULL)
|
||||
{
|
||||
_p->root = realname;
|
||||
}
|
||||
else
|
||||
{
|
||||
_status = -1;
|
||||
}
|
||||
}
|
||||
|
||||
DirWalk::~DirWalk()
|
||||
{
|
||||
closedir(_p->dir);
|
||||
delete _p;
|
||||
}
|
||||
|
||||
bool DirWalk::isReady() const
|
||||
{
|
||||
return _p->dir != NULL;
|
||||
}
|
||||
|
||||
int DirWalk::next(std:; string& name, bool& is_dir)
|
||||
{
|
||||
dirent* file = NULL;
|
||||
if ((file = readdir(Dir)) != NULL)
|
||||
{
|
||||
if (file->d_type == DT_DIR)
|
||||
{
|
||||
if (strcmp(file->d_name, ".") != 0 &&
|
||||
strcmp(file->d_name, "..") != 0)
|
||||
{
|
||||
is_dir = true;
|
||||
name = file->d_name;
|
||||
return 1;
|
||||
}
|
||||
else return next(name, is_dir);
|
||||
}
|
||||
else
|
||||
{
|
||||
name = file->d_name;
|
||||
is_dir = false;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
std::string DirWalk::getroot()
|
||||
{
|
||||
return _p->root;
|
||||
}
|
||||
|
||||
#endif // End of ifndef _WIN32
|
82
FileWrapper_Win.cpp
Normal file
82
FileWrapper_Win.cpp
Normal file
|
@ -0,0 +1,82 @@
|
|||
#ifdef _WIN32
|
||||
#include "FileWrapper.h"
|
||||
#include <Windows.h>
|
||||
|
||||
struct DirWalk::_impl
|
||||
{
|
||||
HANDLE hand;
|
||||
WIN32_FIND_DATA fnd;
|
||||
std::string root;
|
||||
// -1 Not Opened 0 End 1 Ready
|
||||
int status;
|
||||
};
|
||||
|
||||
DirWalk::DirWalk(const std::string& DirName) : _p(new _impl)
|
||||
{
|
||||
std::string realname = DirName;
|
||||
int sz = realname.size();
|
||||
if (realname[sz - 1] != '\'')
|
||||
{
|
||||
realname.push_back('\\');
|
||||
}
|
||||
_p->root = realname;
|
||||
realname.push_back('*');
|
||||
|
||||
_p->hand = FindFirstFile(realname.c_str(), &_p->fnd);
|
||||
if (_p->hand != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
_p->status = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
_p->status = -1;
|
||||
}
|
||||
}
|
||||
|
||||
DirWalk::~DirWalk()
|
||||
{
|
||||
if (_p->hand != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
FindClose(_p->hand);
|
||||
}
|
||||
delete _p;
|
||||
}
|
||||
|
||||
bool DirWalk::isReady() const
|
||||
{
|
||||
return _p->status >= 0;
|
||||
}
|
||||
|
||||
std::string DirWalk::getroot() const
|
||||
{
|
||||
return _p->root;
|
||||
}
|
||||
|
||||
int DirWalk::next(std::string& name, bool& is_dir)
|
||||
{
|
||||
if (_p->status == 1)
|
||||
{
|
||||
name = _p->fnd.cFileName;
|
||||
if (_p->fnd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
is_dir = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
is_dir = false;
|
||||
}
|
||||
|
||||
// Step down
|
||||
if (!FindNextFile(_p->hand, &_p->fnd))
|
||||
{
|
||||
_p->status = 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif // End of _WIN32
|
Loading…
Reference in New Issue
Block a user