2017-01-31 9 views
0

ファイルパスはCString形式で受け取ります。例:C:\ Program Files \ Program \ Maps \ World \ North-AmericaCStringの先頭部分を削除する

マップの前にすべてを削除する必要があります。私はC:\ Program Files \ Program \ですが、このファイルパスは異なる場合があります。

は、私が試した:

CString noPath = fullPath; 
fullPath.Truncate(fullPath.ReverseFind('Maps')); 
noPath.Replace(_T(fullPath),_T("")); 

一貫して動作しません。それは間違った場所でいくつかのファイルパスを切断しています。解決策は、切り捨てが/置換を使用する必要はありませんが、私は精通よこれを行うには

+0

'地図' は、 "マップ" –

+0

簡潔問題の説明を入力してくださいする必要があります。あなたが今まで述べてきたことは、いずれの側でも切り捨てられます。その問題は、私たちの情報を考えれば解決できません。 – IInspectable

+0

タグを 'C++ 'から' C++/cli'に変更したり、少なくともタグを含めると、より良い運を得ることができます。 –

答えて

1

CStringTruncateメンバーを持っていないとReverseFindは単一の文字ではなく、部分文字列でどのように動作するかそうでないかわかりません;だからfullPathのタイプは私の謎です。

あなたのコードには_T(fullPath)が表示されますが、_Tマクロはリテラル(引用符で囲まれた文字列または文字)でのみ機能します。

とにかく、ここにはCString - オンリーソリューションがあります。

CString TruncatePath(CString path, CString subdir) { 
    CString sub = path; 
    const int index = sub.MakeReverse().Find(subdir.MakeReverse()); 
    return index == -1 ? path : path.Right(index + subdir.GetLength()); 
} 
    ... 

CString path  = _T("C:\\Program Files\\Program\\Maps\\World\\North-America"); 
CString sub_path = TruncatePath(path, _T("Maps\\")); 

はあなたにsub_pathを与える:あなたは、この目的のためにDelete機能を使用することができますMaps\World\North-America

+0

インデックスに5を追加してMaps \ World \ North-Americaを印刷するだけでしたが、これは完全に機能しました。ありがとうございました – user7497377

+0

サブディレクトリが返された切り詰められたパスの先頭に保持されるように関数を更新しました。 –

-1

。例えば

CString path(_T("C:\\Program Files\\Program\\Maps\\World\\North-America")); 
path.Delete(0, path.Find(_T("Maps"))); //pass first index and number of count to delete 

今すぐ変数pathが持っている価値Maps\\World\\North-America

+0

部分文字列が見つからない場合、これは未定義の方法で失敗します。また、 'CString :: Find'呼び出しはディレクトリ名の部分文字列にも一致します。これは、サンプル入力では機能しますが、それほど多くはありません。 – IInspectable

関連する問題