2012-03-09 159 views
1

我有一個路徑,例如,名爲開始C++:如何在該文件的路徑與給定的路徑

/我的/路徑/測試/ mytestpath

判斷,我想,如果它與給定的路徑入手,來判斷例如

/我的/路徑

+0

這聽起來像一個簡單的[有問題的開始(http://stackoverflow.com/questions/931827/stdstring-comparison-check-whether-string-begins-with-another-string )除非你打算擴展路徑(例如'〜') – Joe 2012-03-09 15:02:40

+0

即使沒有擴展,它也不是那麼簡單,@Joe。文件*字符串*以'/ my/pa'開頭,但*路徑*不包含它。 – 2012-03-09 15:07:01

+1

您可能需要首先對路徑進行規範化,特別是在UNIX系統中使用特殊通配符和符號鏈接。 – CashCow 2012-03-09 15:07:26

回答

1

std::string::find()點返回的索引在該字符串中發現,爲0的索引是字符串的開始:

std::string path("/my/path/test/mytestpath"); 

// This will check if 'path' begins with "/my/path/". 
// 
if (0 == path.find("/my/path/")) 
{ 
    // 'path' starts with "/my/path". 
} 
+0

hmjd,感謝您的幫助。但是我需要判斷路徑是否以「/ my/path」開頭,不僅包含。 – zhaojing 2012-03-09 15:03:24

+0

@趙靖代碼確實如此。 – 2012-03-09 15:03:42

+0

@趙經,更新答案和解釋。 – hmjd 2012-03-09 15:04:24

1
  1. 子字符串的字符串原始的長度(/我的/路徑)(/我的/ path/test/mytestpath)。
  2. 檢查兩個字符串是否相等。
+0

好的建議!謝謝,我會嘗試。 – zhaojing 2012-03-09 15:04:00

+1

您必須考慮檢查'/ my/path /',否則'/ my/pathSomeDeviatingPath /'將會匹配。注意'/'。 – Mahesh 2012-03-09 15:10:18

+0

感謝您提醒〜 – zhaojing 2012-03-09 15:19:32

1

可以對較短字符串中的字符數進行字符串比較。

是自身的字符匹配並不意味着它事實上是一個子路徑,因爲你需要檢查的是,在較長的字符串的下一個字符是「/」

在C你可以使用STRNCMP ()需要一段字符。

在C++中,您可以使用相同或字符串比較函數。 find()函數將爲此工作,但請記住還要檢查主路徑中的下一個字符是否爲目錄分隔符。

你可以「標記」你的路徑,但這可能不值得。

+0

需要額外檢查+1(除非您確保較短路徑以'/'結尾)。 – 2012-03-09 15:36:01

6

Boost.Filesystem可能是最健壯的解決方案。嘗試是這樣的:

bool isSubDir(path p, path root) 
{ 
    while(p != path()) { 
     if(p == root) { 
      return true; 
     } 
     p = p.parent_path(); 
    } 
    return false; 
} 
+0

+1。趙靖真的很想知道什麼;目前的描述聽起來像是他在解決問題的過程中被卡住了。 – MSalters 2012-03-09 15:48:28

+0

根據你想要的行爲,使用'equivalent'而不是'operator =='可能更好。 – 2012-03-09 15:57:42

相關問題