2017-01-31 77 views
0

我以CString的形式接收文件路徑。例如:C:\ Program Files \ Program \ Maps \ World \ North-America刪除CString的開始

我需要刪除Maps之前的所有內容。即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

我熟悉的CString沒有Truncate成員和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_pathMaps\World\North-America

+0

我只需要在索引中添加5就可以打印地圖\世界\北美,但是這個工作很完美。謝謝 – user7497377

+0

我更新了函數,以便subdir現在保留在返回的截斷路徑的開頭。 –

-1

可以使用Delete函數用於此目的。

例如:

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'-call也會匹配目錄名稱的子字符串。這適用於樣本輸入,但沒有更多。 – IInspectable