2

主にオブジェクトに wxWidgets を使用する C++ で書かれたアプリケーションに取り組んでいます。ここで、次の wxString 変数があるとします。

wxString path = "C:\\Program Files\\Some\\Path\\To\\A\\Directory\\";

末尾のスラッシュを削除する方法はありますか? wxString はTrim()メソッドを提供しますが、空白文字にのみ適用されます。文字列を別の文字列型に変換することを考え、そこでストリッピングを実行して wxString 型に戻すこともできます (wxString 型を使用することが不可欠です)。それ。

4

4 に答える 4

2

これは、適切なパス解析の代替手段がない場合に使用するものです。

wxString& remove_trailing_backslashes(wxString& path)
{
   auto inb = path.find_last_not_of(L'\\');
   if(inb != wxString::npos)
      path.erase(inb + 1); //inb + 1 <= size(), valid for erase()
   else //empty string or only backslashes
      path.clear();
   return path; //to allow chaining
}

ノート:

  • 異常なことをしていない限り、 s を内部にwxString格納するため、不要な変換を避けるためにwchar_tワイド文字列と文字リテラル (接頭辞 ) を使用することは理にかなっています。L
  • 文字列が UTF-8 でエンコードされているという異常なケースでも、上記のコード\は ASCII と同様に機能するため、別のコード ポイントのエンコーディングでは表示されLません (この場合、プレフィックスは適用されなくなります。もちろん)。
  • を使用せざるを得ない場合でも、wx 固有の関数ではなく、可能な限り に似たインターフェイスwxStringを使用することをお勧めします。に置き換えるとstd::basic_string、上記のコードは正常に機能します。wxStringstd::wstring
  • どのVZをサポートしています。彼の答えで言った、これらの単純な文字列ベースのソリューションはすべて、および空の文字列にストリップC:\されることに注意してください。これは、あなたが望むものではないかもしれません. このような問題を回避するために、Boost.Filesystemライブラリを使用します。これは、私の知る限り、提案されている標準ライブラリのファイルシステム機能に最も近いものです (正式には標準の一部ではありませんが、非常に近いものです)。C:\

完全を期すために、Boost.Filesystem を使用すると次のようになります。

wxString remove_trailing_backslashes(const wxString& arg)
{
   using boost::filesystem::path;
   static const path dotp = L".";

   path p = arg.wc_str();
   if(p.filename() == dotp)
      p.remove_filename();
   return p.native();
}

主に文字列がその場で変更されないため、上記のアドホック ソリューションほど効率的ではありませんが、特別なパス形式によって引き起こされる問題に対してより回復力があります。

于 2015-03-26T16:34:20.450 に答える
1

私のユースケースでは、実際には、末尾にスラッシュがないシナリオも考慮しています。

私は2つの解決策を思いつきました。1 つ目は正規表現を使用します。

wxRegEx StripRegex("(.+?)\\\\*$", wxRE_ADVANCED);
if (StripRegex.Matches(path))
{
  path = StripRegex.GetMatch(path,1);
}

2番目は、@catalinが提案したように、次を使用しますRemoveLast:

while (path.EndsWith("\\"))
{
  path.RemoveLast();
}

編集: @VZの提案を使用して、次のことを思いつきました:

// for some reason, the 'Program Files' part get's taken out in the resulting string
// so I have to first replace the double slashes
path.Replace("\\\\","\\");
path = wxFileName::DirName(path).GetPath();
于 2015-03-26T11:07:23.903 に答える