6

我知道,要从给定的绝对路径在 Qt 中创建新路径,您可以使用QDir::makepath()as dir.makepath(path),正如这个问题中所建议的那样。我使用它没有任何问题,而且效果很好。我的问题是针对为什么开发人员不提供静态函数来以QDir::makepath("/Users/me/somepath/");. 对我来说,需要创建一个新QDir实例似乎没有必要。

我只能想到两个可能的原因:

1.开发人员“懒惰”或没有时间,所以没有添加一个,因为这不是绝对必要的。

2.QDir on which被调用的实例mkpath(path)也将设置path为,以便进一步使用 - 但我似乎找不到任何暗示这是文档中的实际行为。

我知道我在重复自己,但我再次强调,我不需要帮助来了解如何做到这一点,但我对为什么必须这样做很感兴趣。感谢我可能错过的任何原因。

4

1 回答 1

4

让我们看一下上述方法的代码:

bool QDir::mkdir(const QString &dirName) const
{
    const QDirPrivate* d = d_ptr.constData();

    if (dirName.isEmpty()) {
        qWarning("QDir::mkdir: Empty or null file name");
        return false;
    }

    QString fn = filePath(dirName);
    if (d->fileEngine.isNull())
        return QFileSystemEngine::createDirectory(QFileSystemEntry(fn), false);
    return d->fileEngine->mkdir(fn, false);
}

来源:http ://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io/qdir.cpp#n1381

正如我们所见,静态版本很容易实现:

bool QDir::mkdir(const QString &dirName) const
{
    if (dirName.isEmpty()) {
        qWarning("QDir::mkdir: Empty or null file name");
        return false;
    }

    return QFileSystemEngine::createDirectory(QFileSystemEntry(dirName), false);
}

(另见http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io/qdir.cpp#n681

首先,非静态方法有几个优点。显然,使用对象的现有文件引擎是有好处的。而且,我会想象在特定目录下创建多个目录的用例(QDir已经指向)。

那么为什么不两者都提供呢?

判决(tl/dr):我认为原因是简单的代码卫生。QDir::makepath(path);当您使用 API 时,和之间的区别QDir().makepath(path);很小。创建对象的性能影响也可以忽略不计,因为如果您碰巧更频繁地执行操作,您将重用同一个对象。但是在代码维护者方面,可以说不维护同一方法的两个版本要方便得多(工作量更少且不易出错) 。

于 2015-10-08T15:55:38.467 回答