mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-03 06:35:08 -04:00
improved FolderIterator class
This commit is contained in:
parent
3c976bb7ee
commit
3e48b0fd95
11 changed files with 183 additions and 62 deletions
|
@ -1,11 +1,17 @@
|
|||
#include <dirent.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "folderiterator.h"
|
||||
#include "rsstring.h"
|
||||
|
||||
|
||||
namespace librs { namespace util {
|
||||
|
||||
|
||||
FolderIterator::FolderIterator(const std::string& folderName)
|
||||
: mFolderName(folderName)
|
||||
{
|
||||
#ifdef WINDOWS_SYS
|
||||
std::wstring utf16Name;
|
||||
|
@ -18,10 +24,10 @@ FolderIterator::FolderIterator(const std::string& folderName)
|
|||
|
||||
handle = FindFirstFileW(utf16Name.c_str(), &fileInfo);
|
||||
validity = handle != INVALID_HANDLE_VALUE;
|
||||
isFirstCall = true;
|
||||
#else
|
||||
handle = opendir(folderName.c_str());
|
||||
validity = handle != NULL;
|
||||
next();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -30,19 +36,71 @@ FolderIterator::~FolderIterator()
|
|||
closedir();
|
||||
}
|
||||
|
||||
bool FolderIterator::readdir() {
|
||||
void FolderIterator::next()
|
||||
{
|
||||
do {
|
||||
if(!readdir())
|
||||
{
|
||||
validity = false ;
|
||||
break ;
|
||||
}
|
||||
|
||||
d_name(mFileName);
|
||||
} while(mFileName == "." || mFileName == "..") ;
|
||||
|
||||
mFullPath = mFolderName + "/" + mFileName ;
|
||||
|
||||
struct stat64 buf ;
|
||||
|
||||
#ifdef WINDOWS_SYS
|
||||
std::wstring wfullname;
|
||||
librs::util::ConvertUtf8ToUtf16(mFullPath, wfullname);
|
||||
if ( 0 == _wstati64(wfullname.c_str(), &buf))
|
||||
#else
|
||||
if ( 0 == stat64(mFullPath.c_str(), &buf))
|
||||
#endif
|
||||
{
|
||||
mFileModTime = buf.st_mtime ;
|
||||
mStatInfoOk = true;
|
||||
|
||||
if (S_ISDIR(buf.st_mode))
|
||||
{
|
||||
mType = TYPE_DIR ;
|
||||
mFileSize = 0 ;
|
||||
mFileModTime = buf.st_mtime;
|
||||
}
|
||||
else if (S_ISREG(buf.st_mode))
|
||||
{
|
||||
mType = TYPE_FILE ;
|
||||
mFileSize = buf.st_size;
|
||||
mFileModTime = buf.st_mtime;
|
||||
}
|
||||
else
|
||||
{
|
||||
mType = TYPE_UNKNOWN ;
|
||||
mFileSize = 0 ;
|
||||
mFileModTime = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mType = TYPE_UNKNOWN ;
|
||||
mFileSize = 0 ;
|
||||
mFileModTime = 0;
|
||||
validity = false ;
|
||||
}
|
||||
}
|
||||
|
||||
bool FolderIterator::readdir()
|
||||
{
|
||||
if(!validity)
|
||||
return false;
|
||||
|
||||
#ifdef WINDOWS_SYS
|
||||
if(isFirstCall) {
|
||||
isFirstCall = false;
|
||||
return true;
|
||||
}
|
||||
return FindNextFileW(handle, &fileInfo) != 0;
|
||||
#else
|
||||
ent = ::readdir(handle);
|
||||
return ent != 0;
|
||||
return ent != NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -65,6 +123,11 @@ bool FolderIterator::d_name(std::string& dest)
|
|||
return true;
|
||||
}
|
||||
|
||||
const std::string& FolderIterator::file_fullpath() { return mFullPath ; }
|
||||
const std::string& FolderIterator::file_name() { return mFileName ; }
|
||||
uint64_t FolderIterator::file_size() { return mFileSize ; }
|
||||
time_t FolderIterator::file_modtime() { return mFileModTime ; }
|
||||
|
||||
bool FolderIterator::closedir()
|
||||
{
|
||||
if(!validity)
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define FOLDERITERATOR_H
|
||||
|
||||
|
||||
#include <stdint.h>
|
||||
#include <iostream>
|
||||
#include <cstdio>
|
||||
|
||||
|
@ -24,14 +25,24 @@ public:
|
|||
FolderIterator(const std::string& folderName);
|
||||
~FolderIterator();
|
||||
|
||||
bool isValid() const { return validity; }
|
||||
enum { TYPE_UNKNOWN = 0x00,
|
||||
TYPE_FILE = 0x01,
|
||||
TYPE_DIR = 0x02
|
||||
};
|
||||
|
||||
bool isValid() const { return validity; }
|
||||
bool readdir();
|
||||
void next();
|
||||
|
||||
bool d_name(std::string& dest);
|
||||
|
||||
bool closedir();
|
||||
|
||||
const std::string& file_name() ;
|
||||
const std::string& file_fullpath() ;
|
||||
uint64_t file_size() ;
|
||||
uint64_t file_type() ;
|
||||
time_t file_modtime() ;
|
||||
|
||||
private:
|
||||
bool validity;
|
||||
|
||||
|
@ -43,7 +54,15 @@ private:
|
|||
DIR* handle;
|
||||
struct dirent* ent;
|
||||
#endif
|
||||
void updateStatsInfo() ;
|
||||
|
||||
bool mStatInfoOk ;
|
||||
time_t mFileModTime ;
|
||||
uint64_t mFileSize ;
|
||||
uint8_t mType ;
|
||||
std::string mFileName ;
|
||||
std::string mFullPath ;
|
||||
std::string mFolderName ;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue