wxDir
wxDir
wxDir类是一个相当于 Unix 平台中 opendir/readdir/closedir 命令的功能的类, 可以枚举一个目录下的文件。也允许枚举整个目录。
wxDir 同样也提供了一个灵活的方式来枚举文件, 通过递归方式调用 Traverse 函数或者使用更加简单的 GetAllFiles 函数。
使用示例:
1 wxDir dir(wxGetCwd()); 2 3 if ( !dir.IsOpened() ) 4 { 5 // 在这里处理错误 - wxDir 会输出一个错误消息来解释失败的具体原因 6 return; 7 } 8 9 puts("枚举当前目录下的文件:"); 10 11 wxString filename; 12 13 bool cont = dir.GetFirst(&filename, filespec, flags); 14 // filespec: 文件通配符, 例: _T("*.c"), flags: 枚举类型标志 15 16 while ( cont ) 17 { 18 printf("%s\n", filename.c_str()); 19 20 cont = dir.GetNext(&filename); 21 }
派生于
无父类
常量
这些标识符规定了在通过 GetFirst/GetNext 枚举文件时什么样的文件类型将被枚举。
enum { wxDIR_FILES = 0x0001, // 包含文件 wxDIR_DIRS = 0x0002, // 包含目录 wxDIR_HIDDEN = 0x0004, // 包含隐藏文件 wxDIR_DOTDOT = 0x0008, // 包含 '.' 和 '..' // 默认情况下, 将枚举除 '.' 和 '..' 以外的任何内容 wxDIR_DEFAULT = wxDIR_FILES | wxDIR_DIRS | wxDIR_HIDDEN }
所在头文件
<wx/dir.h>
成员
wxDir::wxDir
wxDir::~wxDir
wxDir::Exists
wxDir::GetAllFiles
wxDir::FindFirst
wxDir::GetFirst
wxDir::GetName
wxDir::GetNext
wxDir::GetTotalSize
wxDir::HasFiles
wxDir::HasSubDirs
wxDir::IsOpened
wxDir::Open
wxDir::Traverse
wxDir::wxDir
wxDir()
默认构造函数。
wxDir(const wxString& dir)
为枚举打开目录, 使用 IsOpened() 来检测错误。
wxDir::~wxDir
~wxDir()
wxDir的析构函数, 用于清理所占用的相关资源。 这不是一个虚函数, 所以意味着这个类并不能以多态方式使用。
wxDir::Exists
static bool Exists(const wxString& dir)
检测目录是否存在。
wxDir::GetAllFiles
static size_t GetAllFiles(const wxString& dirname, wxArrayString *files, const wxString& filespec = wxEmptyString, int flags = wxDIR_DEFAULT)
该函数将会把位于 dirname 目录下的所有文件的完整路径添加到数组 files 中(注意: 数组中旧的内容将会被保存). 只有符合文件通配符 filespec 的才会被添加, 使用空的通配符将匹配所有文件。
在 flags 参数中必须包含 wxDIR_FILES 标志, 否则数组中的值将不会被改变, 同样还应该包含 wxDIR_DIRS 标识符, 以便通过递归进入到子目录中 (这两个标识符在默认值中已被包含)。
参见: Traverse
wxDir::FindFirst
static wxString FindFirst(const wxString& dirname, const wxString& filespec, int flags = wxDIR_DEFAULT)
该函数将返回第一个符合文件通配符 filespec 的文件路径, 否则返回一个空的字符串表示没有文件得到匹配。
参数 flags 对于 wxDIR_FILES 标识符的包含可以忽略, 不会影响到该函数的行为。 在默认情况下, flags 参数将包含 wxDIR_DIRS 标识符, 以便进入到子目录进行匹配, 但是这不是必须的, 在不含该标识符的情况下函数仅在 dirname 目录中进行匹配。
参见: Traverse
wxDir::GetFirst
bool GetFirst(wxString* filename, const wxString& filespec = wxEmptyString, int flags = wxDIR_DEFAULT) const
开始枚举所有符合 filespec (如果为空, 则枚举所有文件) 并且符合 flags 的文件, 返回 true 时表示成功。
wxDir::GetName
wxString GetName() const
返回自身完整的目录名称, 结尾处不包含路径分隔符 (斜杠 或 反斜杠)。
wxDir::GetNext
bool GetNext(wxString* filename) const
按照最后一次调用 GetFirst 时的匹配规则继续枚举文件。
wxDir::GetTotalSize
static wxULongLong GetTotalSize(const wxString& dir, wxArrayString* filesSkipped = NULL)
通过递归方式获得 dir 目录下所有文件的总大小并返回(以字节为单位), 当遇到错误时返回 wxInvalidSize 标志。
当递归遍历时遇到文件大小不可读的情况, 该文件将被添加到 filesSkipped 数组中, , 并且跳过。 这通常发生在一些特殊的文件夹下, 如被系统或其他进程锁定。 当 filesSkipped->GetCount() 不为零时说明所返回的值不是100%的准确和, 如果跳过的文件比较大, 就会造成得到的结果和实际大小相差较大。
参见: wxFileName::GetHumanReadableSize, wxGetDiskSpace
wxDir::HasFiles
bool HasFiles(const wxString& filespec = wxEmptyString)
判断目录中是否含有文件, 当目录中包含任何符合通配符 filespec 的文件时返回 true。如果 filespec 为空, 查找所有类型的文件。隐藏文件也在查找的范围内。
wxDir::HasSubDirs
bool HasSubDirs(const wxString& dirspec = wxEmptyString)
判断目录中是否含有子目录, 当目录中含有任何子目录时返回 true (如果 filespec 不为空, 仅检查是否有与其相匹配的子目录)。 隐藏目录也在查找的范围内。
wxDir::IsOpened
bool IsOpened() const
如果目录已经被 Open 函数成功打开, 返回 true 。
wxDir::Open
bool Open(const wxString& dir)
为枚举打开目录, 返回 true 表示成功, false 表示发生了错误。
wxDir::Traverse
size_t Traverse(wxDirTraverser& sink, const wxString& filespec = wxEmptyString, int flags = wxDIR_DEFAULT)
通过递归方式进行枚举, 每枚举到一个文件或目录都会交给 wxDirTraverser 对象进行处理。
//译者注: wxDirTraverse是个抽象类, 你需要继承并且实现它的OnFile, OnDir方法以自定义你想要的操作。
更准确的说, 当 flags 含有 wxDIR_DIRS 标识符时该函数通过递归方式进入到子目录。如果 wxDIR_FILES 存在时, 它将忽略文件 (但是尽可能的递归进入到子目录)。
每发现一个目录, sink.OnDir() 就会被调用并且 sink.OnFile() 函数将会被每个文件调用。 通过返回值决定枚举是否继续进行。
该函数将返回所有枚举到的文件数, 返回 (size_t)-1 时表示遇到错误。
参见: GetAllFiles
官方原文: http://docs.wxwidgets.org/2.8/wx_wxdir.html
[译者注] 本文翻译不具有任何权威性, 且不代表原文观点, 请谨慎参阅。
wid, 2013.03.01