C Dirent.h的现代C++包装器

Aco*_*orn 5 c++ pointers c++11

我试图围绕c头dirent.h编写一个现代的c ++包装器.

要读取C中目录的内容,请编写如下内容:

int listdir(const char *path) {
  struct dirent *entry;
  DIR *dp;

  dp = opendir(path);
  if (dp == NULL) {
    perror("opendir");
    return -1;
  }

  while((entry = readdir(dp)))
    puts(entry->d_name);

  closedir(dp);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

把它转换成现代c ++,我有以下内容(其中m_dir和m_dirent是std::unique_ptr,而m_files是a std::vector<string>)

filesystem::Directory::Directory(std::string dir) : m_dir(opendir(dir.c_str()), closedir),
                                                  m_dirent(new struct dirent())
{
    //If the directory can not be read, throw an error.
    if (!m_dir) {
        sdl2::SDLFileSystemRead_Failure ex;
        throw ex;
    }

    while (&(*m_dirent = *readdir(&*m_dir)))
    {

        m_files.emplace_back(std::string(m_dirent->d_name));

    }

}
Run Code Online (Sandbox Code Playgroud)

这只有一半有效.当我写这篇文章时,我不知道我只是在检查表达式的地址是否*m_dirent = *readdir(&*m_dir)存在(当然,它确实存在!).根据单一UNIX®规范版本2,readdir(DIR*)如果已读取最后一个文件并且没有更多文件需要读取,则返回空指针.但是,我不确定如何在不调用的情况下将dirent指针设置为dir指针正在读取的.reset()内容m_dirent.这样做只会导致读取垃圾数据,因为我认为文件指针在dirent被销毁时会丢失.

我怎么能转换这个

  while((entry = readdir(dp)))
    puts(entry->d_name);
Run Code Online (Sandbox Code Playgroud)

进入现代C++?

Que*_*tin 1

逗号运算符来救援!

while(entry.reset(readdir(m_dir.get())), entry)
    puts(entry->d_name);
Run Code Online (Sandbox Code Playgroud)

尽管,正如评论所说,这对于文件系统来说并不是一个出色的 API。例如,透明地适应底层目录的迭代器会很酷。