【问题标题】:dirname(php) similar function in c++c++中的dirname(php)类似函数
【发布时间】:2011-07-01 22:50:42
【问题描述】:

c++中有没有类似php中dirname的函数...用来规范化url

eg
<?php
$url = "../tets/index.html";
$currentURL = "http://example.com/somedir/anotherdir";
echo dirname($currentURL).substr($url, 2);
?>

【问题讨论】:

标签: c++


【解决方案1】:

不,但是自己实现它是微不足道的。

std::string DirName(std::string source)
{
    source.erase(std::find(source.rbegin(), source.rend(), '/').base(), source.end());
    return source;
}

最好将其实现为方法模板:

template<typename string_t>
string_t DirName(string_t source)
{
    source.erase(std::find(source.rbegin(), source.rend(), '/').base(), source.end());
    return source;
}

编辑:出于某种原因,如果您想知道@larsmans 在下面的评论中所说的内容:

template<typename string_t>
string_t DirName(string_t source)
{
    if (source.size() <= 1) //Make sure it's possible to check the last character.
    {
        return source;
    }
    if (*(source.rbegin() + 1) == '/') //Remove trailing slash if it exists.
    {
        source.pop_back();
    }
    source.erase(std::find(source.rbegin(), source.rend(), '/').base(), source.end());
    return source;
}

【讨论】:

  • ... 除了 OP 可能希望将 foo/bar/ 转换为 foo 而不是 foo/bar,并且在路径/URL 处理中还有几个极端情况。
  • @larsmans:这段代码做了dirname 所做的事情。如果您的描述是 OP 想要的,那么他需要指定。显然,如果他需要做更多事情,那么使用库是个好主意,但这项任务本身就是微不足道的。
  • 除了“如果路径中没有斜杠,则返回一个点('.'),表示当前目录”... 很公平,+1。
  • @larsmans:此外,这不会删除尾部斜杠。这与dirname 不同,但与上面的 OP 示例匹配:/
【解决方案2】:

在 C++ 语言中没有目录访问。您需要使用 FindFirst/FindNext (Microsoft Windows) 等平台相关函数或 boost (Boost.Filesystem) 等库来实现这一点。

【讨论】:

  • C++ 中肯定有文件访问。
  • shlwapi.lib 中更有可能有一个 Path...() 函数执行相同的操作,而无需使用 FindFirst()/FindNext() 遍历路径...
  • @larsman:您可以使用 C 运行时函数和 C++ 标准库访问文件,但不能使用 C++ 语言。您为目录访问建议了哪些函数或类?
  • 好的,它不在语言中,它在中。我认为这种区别与 OP 的需求无关。
【解决方案3】:

标准 C++ 没有目录的概念,因此您要么必须使用特定于平台的函数,要么必须使用可移植库,例如 Boost.Filesystem

我不会在 URL 上使用这样的函数;尝试找到合适的URL parsing library

【讨论】:

  • 如果 OP 需要做更多的事情,请 +1 指出一些好的库:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
相关资源
最近更新 更多