以便携方式在C ++中读取目录

时间:2011-03-15 12:05:57

标签: c++

我有如下要求。我有一个目录,例如我有/ tmp / myFolder

在“myFolder”下,我的文件名称如下

myFile-N001.txt
myFile-N002.txt
myFile-N003.txt

在我的应用程序中写入文件时我应该写入/ tmp / myFolder中的最大数字文件,例如在上面的情况下我应该写入myFile-N003.txt。

  

上述内容应以C ++实现,并以便携式方式实现,最好采用POSIX方式。

任何人都可以举例说明我们如何在C ++中实现这一目标。

由于

4 个答案:

答案 0 :(得分:3)

如果你满意的话:

  • 仅适用于POSIX
  • 您知道您正在寻找的模式

您可以使用POSIX中的 glob() 功能获取列表。

然后你可以使用std :: max和结果集进行自定义比较,你的迭代器范围是globres.gl_pathv [0],globres.gl_pathv [globres.gl_pathc],比较类似于:

bool strless(const char* str1, const char* str2 )
{
   return strcmp( str1, str2 ) < 0;
}

虽然很可能已经有了这样的事情

glob的“man”页面的开头:

   #include <glob.h>

   int glob(const char *pattern, int flags,
            int (*errfunc) (const char *epath, int eerrno),
            glob_t *pglob);

   void globfree(glob_t *pglob);

<强>描述

glob()函数根据shell使用的规则搜索匹配模式的所有路径名(请参阅glob(7))。没有代字号扩展或参数替换 已经完成了;如果您需要这些,请使用wordexp(3)。

globfree()函数将之前调用的动态分配存储空间释放到glob()

glob()调用的结果存储在pglob指向的结构中。此结构的类型为glob_t(在<glob.h>中声明),并包含以下元素 由POSIX.2定义(更多可能作为扩展名存在):

 typedef struct 
 {
     size_t   gl_pathc;    /* Count of paths matched so far  */
     char   **gl_pathv;    /* List of matched pathnames.  */
     size_t   gl_offs;     /* Slots to reserve in gl_pathv.  */
 } glob_t;

2004年10月有一个discussion关于将glob引入提升我认为它没有实现:

答案 1 :(得分:2)

有用于以符合POSIX标准的方式here从目录中检索文件列表的代码。

你可以通过对结果数组进行排序并弹出最后一个元素来构建它。那将是你想要找到的文件。

答案 2 :(得分:1)

您可以使用boost::filesystem来实现此目标。

答案 3 :(得分:1)

这实际上是两个问题。我将使用Boost.Filesystem来移植文件,并将它们存储在vector中(未经测试

std::string maxname;
unsigned maxnum = 0;

for (fs::path::iterator i(dir.begin()), end(dir.end()); i != end; ++i) {
    std::string name = i->string();
    unsigned num;
    if (std::sscanf(name.c_str(), "myFile-N%u.txt", &num) == 1
     && num >= maxnum) {
        maxnum = num;
        maxname = name;
    }
}

然后检查循环后maxname是否包含空字符串。如果没有,它将保留您想要的文件名。