Remove Directory class replaced with filesystem API
parent
b6b543438d
commit
48bef14233
|
@ -1,82 +0,0 @@
|
|||
// directory.h
|
||||
//
|
||||
// Copyright (C) 2003, Chris Laurel <claurel@shatters.net>
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either version 2
|
||||
// of the License, or (at your option) any later version.
|
||||
|
||||
#include <iostream>
|
||||
#include "directory.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
bool Directory::enumFiles(EnumFilesHandler& handler, bool deep)
|
||||
{
|
||||
string filename;
|
||||
|
||||
while (nextFile(filename))
|
||||
{
|
||||
// Skip all files beginning with a period, most importantly, . and ..
|
||||
if (filename[0] == '.')
|
||||
continue;
|
||||
|
||||
// TODO: optimize this to avoid allocating so many strings
|
||||
string pathname = handler.getPath() + string("/") + filename;
|
||||
if (IsDirectory(pathname))
|
||||
{
|
||||
if (deep)
|
||||
{
|
||||
Directory* dir = OpenDirectory(pathname);
|
||||
bool cont = true;
|
||||
|
||||
if (dir != nullptr)
|
||||
{
|
||||
handler.pushDir(filename);
|
||||
cont = dir->enumFiles(handler, deep);
|
||||
handler.popDir();
|
||||
delete dir;
|
||||
}
|
||||
|
||||
if (!cont)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!handler.process(filename))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void EnumFilesHandler::pushDir(const std::string& dirName)
|
||||
{
|
||||
if (!dirStack.empty())
|
||||
dirStack.push_back(dirStack.back() + string("/") + dirName);
|
||||
else
|
||||
dirStack.push_back(dirName);
|
||||
}
|
||||
|
||||
|
||||
void EnumFilesHandler::popDir()
|
||||
{
|
||||
dirStack.pop_back();
|
||||
}
|
||||
|
||||
|
||||
const string& EnumFilesHandler::getPath() const
|
||||
{
|
||||
// need this so we can return a non-temporary value:
|
||||
static const string emptyString;
|
||||
|
||||
if (!dirStack.empty())
|
||||
return dirStack.back();
|
||||
|
||||
return emptyString;
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
// directory.h
|
||||
//
|
||||
// Copyright (C) 2002, Chris Laurel <claurel@shatters.net>
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either version 2
|
||||
// of the License, or (at your option) any later version.
|
||||
|
||||
#ifndef _CELUTIL_DIRECTORY_H_
|
||||
#define _CELUTIL_DIRECTORY_H_
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
class EnumFilesHandler
|
||||
{
|
||||
public:
|
||||
EnumFilesHandler() = default;
|
||||
virtual ~EnumFilesHandler() = default;
|
||||
|
||||
void pushDir(const std::string&);
|
||||
void popDir();
|
||||
const std::string& getPath() const;
|
||||
|
||||
virtual bool process(const std::string& filename) = 0;
|
||||
|
||||
private:
|
||||
std::vector<std::string> dirStack;
|
||||
};
|
||||
|
||||
class Directory
|
||||
{
|
||||
public:
|
||||
Directory() = default;
|
||||
virtual ~Directory() = default;
|
||||
|
||||
virtual bool nextFile(std::string&) = 0;
|
||||
|
||||
virtual bool enumFiles(EnumFilesHandler& handler, bool deep);
|
||||
};
|
||||
|
||||
extern std::string WordExp(const std::string&);
|
||||
extern Directory* OpenDirectory(const std::string&);
|
||||
extern bool IsDirectory(const std::string&);
|
||||
|
||||
|
||||
#endif // _CELUTIL_DIRECTORY_H_
|
|
@ -1,135 +0,0 @@
|
|||
// unixdirectory.cpp
|
||||
//
|
||||
// Copyright (C) 2002, Chris Laurel <claurel@shatters.net>
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either version 2
|
||||
// of the License, or (at your option) any later version.
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <dirent.h>
|
||||
#include <wordexp.h>
|
||||
|
||||
#include <utility>
|
||||
#include "directory.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
#ifdef TARGET_OS_MAC
|
||||
#ifdef QT_CORE_LIB
|
||||
// Crash on Mac OS X / Qt4 version when calling wordfree.
|
||||
// This seems to happen only with Leopard.
|
||||
#define WORDEXP_PROBLEM
|
||||
#endif
|
||||
#endif
|
||||
|
||||
class UnixDirectory : public Directory
|
||||
{
|
||||
public:
|
||||
UnixDirectory(std::string /*_dirname*/);
|
||||
~UnixDirectory() override;
|
||||
|
||||
bool nextFile(std::string& /*filename*/) override;
|
||||
|
||||
enum {
|
||||
DirGood = 0,
|
||||
DirBad = 1
|
||||
};
|
||||
|
||||
private:
|
||||
string dirname;
|
||||
int status;
|
||||
DIR* dir;
|
||||
};
|
||||
|
||||
|
||||
UnixDirectory::UnixDirectory(std::string _dirname) :
|
||||
dirname(std::move(_dirname)),
|
||||
status(DirGood),
|
||||
dir(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
UnixDirectory::~UnixDirectory()
|
||||
{
|
||||
if (dir != nullptr)
|
||||
{
|
||||
closedir(dir);
|
||||
dir = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool UnixDirectory::nextFile(std::string& filename)
|
||||
{
|
||||
if (status != DirGood)
|
||||
return false;
|
||||
|
||||
if (dir == nullptr)
|
||||
{
|
||||
dir = opendir(dirname.c_str());
|
||||
if (dir == nullptr)
|
||||
{
|
||||
status = DirBad;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
struct dirent* ent = readdir(dir);
|
||||
if (ent == nullptr)
|
||||
{
|
||||
status = DirBad;
|
||||
return false;
|
||||
}
|
||||
|
||||
filename = ent->d_name;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Directory* OpenDirectory(const std::string& dirname)
|
||||
{
|
||||
return new UnixDirectory(dirname);
|
||||
}
|
||||
|
||||
|
||||
bool IsDirectory(const std::string& filename)
|
||||
{
|
||||
struct stat buf;
|
||||
return stat(filename.c_str(), &buf) == 0 ? S_ISDIR(buf.st_mode) : false;
|
||||
}
|
||||
|
||||
std::string WordExp(const std::string& filename)
|
||||
{
|
||||
#ifndef WORDEXP_PROBLEM
|
||||
wordexp_t result;
|
||||
std::string expanded;
|
||||
|
||||
switch(wordexp(filename.c_str(), &result, WRDE_NOCMD)) {
|
||||
case 0: // successful
|
||||
break;
|
||||
case WRDE_NOSPACE:
|
||||
// If the error was `WRDE_NOSPACE',
|
||||
// then perhaps part of the result was allocated.
|
||||
wordfree(&result);
|
||||
default: // some other error
|
||||
return filename;
|
||||
}
|
||||
|
||||
if (result.we_wordc != 1) {
|
||||
wordfree(&result);
|
||||
return filename;
|
||||
}
|
||||
|
||||
expanded = result.we_wordv[0];
|
||||
wordfree(&result);
|
||||
#else
|
||||
std::string expanded = filename;
|
||||
#endif
|
||||
return expanded;
|
||||
}
|
|
@ -1,108 +0,0 @@
|
|||
// windirectory.cpp
|
||||
//
|
||||
// Copyright (C) 2002, Chris Laurel <claurel@shatters.net>
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either version 2
|
||||
// of the License, or (at your option) any later version.
|
||||
|
||||
#include <iostream>
|
||||
#include <utility>
|
||||
#include <windows.h>
|
||||
#include "directory.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
class WindowsDirectory : public Directory
|
||||
{
|
||||
public:
|
||||
WindowsDirectory(std::string /*_dirname*/);
|
||||
~WindowsDirectory() override;
|
||||
|
||||
bool nextFile(std::string& /*filename*/) override;
|
||||
|
||||
enum {
|
||||
DirGood = 0,
|
||||
DirBad = 1
|
||||
};
|
||||
|
||||
private:
|
||||
string dirname;
|
||||
string searchName;
|
||||
int status;
|
||||
HANDLE searchHandle;
|
||||
};
|
||||
|
||||
|
||||
WindowsDirectory::WindowsDirectory(std::string _dirname) :
|
||||
dirname(std::move(_dirname)),
|
||||
status(DirGood),
|
||||
searchHandle(INVALID_HANDLE_VALUE)
|
||||
{
|
||||
searchName = dirname + string("\\*");
|
||||
// Check to make sure that this file is a directory
|
||||
}
|
||||
|
||||
|
||||
WindowsDirectory::~WindowsDirectory()
|
||||
{
|
||||
if (searchHandle != INVALID_HANDLE_VALUE)
|
||||
FindClose(searchHandle);
|
||||
searchHandle = nullptr;
|
||||
}
|
||||
|
||||
|
||||
bool WindowsDirectory::nextFile(std::string& filename)
|
||||
{
|
||||
WIN32_FIND_DATAA findData;
|
||||
|
||||
if (status != DirGood)
|
||||
return false;
|
||||
|
||||
if (searchHandle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
searchHandle = FindFirstFileA(const_cast<char*>(searchName.c_str()),
|
||||
&findData);
|
||||
if (searchHandle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
status = DirBad;
|
||||
return false;
|
||||
}
|
||||
|
||||
filename = findData.cFileName;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FindNextFileA(searchHandle, &findData))
|
||||
{
|
||||
filename = findData.cFileName;
|
||||
return true;
|
||||
}
|
||||
|
||||
status = DirBad;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Directory* OpenDirectory(const std::string& dirname)
|
||||
{
|
||||
return new WindowsDirectory(dirname);
|
||||
}
|
||||
|
||||
|
||||
bool IsDirectory(const std::string& filename)
|
||||
{
|
||||
DWORD attr = GetFileAttributesA(const_cast<char*>(filename.c_str()));
|
||||
if (attr == 0xffffffff)
|
||||
return false;
|
||||
|
||||
return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0);
|
||||
}
|
||||
|
||||
std::string WordExp(const std::string& filename) {
|
||||
return filename;
|
||||
}
|
Loading…
Reference in New Issue