hdf5/c++ 中的测试组存在

Posted

技术标签:

【中文标题】hdf5/c++ 中的测试组存在【英文标题】:Test group existence in hdf5/c++ 【发布时间】:2016-06-10 15:11:33 【问题描述】:

我正在打开一个现有的 HDF5 文件以添加数据;我想确保名为/A 的组存在以供后续访问。我正在寻找一种简单的方法来有条件地创建/A(如果不存在,则创建并返回新组,或者返回现有组)。一种方法是测试/A 的存在。我怎样才能有效地做到这一点?

根据 API 文档,我可以这样做:

H5::H5File h5file(filename,H5F_ACC_RDWR);
H5::H5Group grp;
try
   grp=h5file.openGroup("A");
 catch(H5::Exception& e)
   /* group does not exists, create it */
   grp=h5file.createGroup("A");

但明显的丑陋来自于异常用于传达根本不异常的信息。

有H5::CommonFG::getObjinfo,它似乎包装了H5Gget_objinfo,使得C 例程的假(不存在)返回值抛出异常;所以又是同样的问题。

在这种情况下求助于 C API 是否干净,或者是否有一些函数直接设计用于测试我忽略的 C++ API 中的存在?

【问题讨论】:

看起来与 H5Lexists 等效的 C++ 根本不存在。 try ... catch ... 对我来说似乎比 C++ 更像 Python,但我认为或者使用 C API 是你的两个选择。 【参考方案1】:

我正在测试一个组的存在:

bool H5Location::attrExists(const char* name) const;

这样您就可以在指定位置测试组/数据集/…的存在。

// Test if empty (= new) H5 file
auto isNewFile = this->attrExists(VariablesH5GroupName);

【讨论】:

不是 100% 我需要的(我仍然需要检查它是否是一个组而不是其他属性),但看起来已经尽可能好。谢谢! 实际上,这仅在组具有命名属性时才有效,而且情况并非总是如此......所以这不是一个正确的答案,对不起:/ 刚试过;对于普通数据集,即使数据集存在,它也会返回 false。也许在答案本身中更明显地标记它不是正确的。【参考方案2】:

正如 Yossarian 在他的评论和in this answer 中所建议的,您可以使用 HDF5 1.8.0+ C-API

bool pathExists(hid_t id, const std::string& path)

  return H5Lexists( id, path.c_str(), H5P_DEFAULT ) > 0;


H5::H5File h5file(filename,H5F_ACC_RDWR);
H5::H5Group grp;
if (pathExists(h5file.getId(), "A")) 
   grp=h5file.openGroup("A");
else
   grp=h5file.createGroup("A");

【讨论】:

【参考方案3】:

由于没有一个解决方案对我有用,所以我做了。

H5:H5File file(filename, H5F_ACC_RWWR);
...
if(file.nameExists(groupname))
   return file.openGroup(groupname);
else
   return file.createGroup(groupname);       

【讨论】:

以上是关于hdf5/c++ 中的测试组存在的主要内容,如果未能解决你的问题,请参考以下文章

HDF5作为Windows下的动态链接库Qt/C++

Laravel 测试中间件中的 URL 参数 BEFORE 组中间件

Visual Studio 中的测试单独成功,一组失败

Jmeter接口测试系列之测试用例变量参数化处理

App Engine Java JDO 中的单元测试 XG 跨组事务

一组单元测试类中的spring应用程序上下文