代码改变世界

[译] wxWidgets - wxDir

2013-03-01 13:54  wid  阅读(2644)  评论(2编辑  收藏  举报

  

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