【问题标题】:Get the path "difference" between two directories获取两个目录之间的路径“差异”
【发布时间】:2011-04-28 12:21:33
【问题描述】:

情况:

我有一个或多个绝对路径,例如:

  1. /home/benjamin/test/
  2. /home/benjamin/test/a/1
  3. /home/benjamin/test/b/1

如何区分两条路径?假设我想知道如何从路径 1 到路径 2。预期结果是

/home/benjamin/test/a/1 - /home/benjamin/test/ = /a/1

有没有比字符串相减更优雅的方法?

【问题讨论】:

    标签: c++ directory filesystems


    【解决方案1】:

    你可以用一个简单的正则表达式来做到这一点:

    return($1) if longer =~ /^#{shorter}(.*)$/
    

    这是complete example in Ruby。您可以在命令行中对其进行测试并开始使用它,或者此代码可以让您了解如何在 C++ 中编写正则表达式。

    【讨论】:

      【解决方案2】:

      我会尝试使用std::mismatch (documentation)

      template <class InputIterator1, class InputIterator2>
        pair<InputIterator1, InputIterator2>
          mismatch (InputIterator1 first1, InputIterator1 last1,
                    InputIterator2 first2 );
      
      Return first position where two ranges differ
      

      将[first1,last1) 范围内的元素与从first2 开始的范围内的元素按顺序进行比较,并返回第一个不匹配发生的位置。

      一些代码:

      string
      mismatch_string( string const & a, string const & b ) {
      
          string::const_iterator longBegin, longEnd, shortBegin;
      
          if( a.length() >= b.length() ) {
              longBegin = a.begin();
              longEnd = a.end();
              shortBegin = b.begin();
          }
          else {
              longBegin = b.begin();
              longEnd = b.end();
              shortBegin = a.begin();
          }
      
          pair< string::const_iterator, string::const_iterator > mismatch_pair = 
              mismatch( longBegin, longEnd, shortBegin );
      
          return string(  mismatch_pair.first, longEnd );
      }
      

      将full example with output 上传到键盘。

      【讨论】:

        【解决方案3】:

        假设您不担心/home/benjamin/test/c/.. 之类的事情,那么这将成为一个简单的子字符串匹配练习。

        最懒惰的方法是使用std::string::find 之类的东西。或者,一个小的 while 循环遍历两个字符串,直到它到达一个结尾,或者找到一个字符差异。

        【讨论】:

          【解决方案4】:

          您可以将所有路径插入Trie,然后查看剩余的后缀。

          更通用的是使用edit distance,并为最小编辑距离追溯步骤。

          在我看来,两者都更优雅。但是,首先减去字符串有什么问题?

          【讨论】:

            【解决方案5】:

            我不知道调用 xxxx(...) 的方式,但由于文件路径是树,我会认为 tree traversal algorithm 会尽可能优雅...

            this question 里面有东西。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-12-22
              • 2011-06-28
              • 2020-03-22
              • 2017-02-14
              • 2017-03-27
              • 2011-03-28
              相关资源
              最近更新 更多