2013-03-30 23 views
2

有沒有辦法獲得2個QDir對象的最接近的共同父項?舉例來說:獲取2的共同父項QDir

QDir d1("/someroot/parent/test/folder"); 
QDir d2("/someroot/parent/another/folder"); 

QDir d3 = commonParent(d1, d2); 
// d3 == "/comeroot/parent/" 

不幸的是Boost.Filesystem不是一個選項。

回答

2
const QString commonParent(const QString &path1, const QString &path2) 
{ 
    QString ret = path2; 

    while (!path1.startsWith(ret)) 
     ret.chop(1); 

    if (ret.isEmpty()) 
     return ret; 

    while (!ret.endsWith('/')) 
     ret.chop(1); 

    return ret; 
} 
0

您可以使用QDir::cdUp()

工作實例:

QString commonParent(const QDir& inputDirOne, const QDir& inputDirTwo) { 
    QDir dirOne(inputDirOne); 
    QString dirTwoAbsolutePath = inputDirTwo.absolutePath(); 
    do { 
    if (dirTwoAbsolutePath.startsWith(dirOne.absolutePath())) 
     return dirOne.absolutePath(); 
    } while(dirOne.cdUp()); 
    return QString(); 
} 

與用法:

//QDir dir1("C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Common7\\IDE\\Addins\\somefile.txt"); 
QDir dir1(".."); 
//QDir dir2("C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Licenses\\Update\\1033\\License.htm"); 
QDir dir2("../../.."); 
QString result = commonParent(dir1, dir2); 
qDebug() << "Common Dir : " << (result.isEmpty() ? "Does not exist" : result); 

就與幾個奇怪的路徑測試這些,它工作正常

+0

我不知道什麼樣的正則表達式我會用這個,你能更具體一點嗎? – kai

+0

對不起,從我的手機上打字。我用一個例子更新了我的答案。你甚至不需要一個正則表達式tbh,因爲在一條路徑上使用cdUp()就足夠滿足你對QString :: startsWith()檢查的需求。 – Viv

+1

不幸的是'cdUp()'不起作用,因爲這需要目錄已經存在。 – kai