QDir::rename:参数冗余?

5

我正在使用QT 5.7,并从文档中了解到:

bool QDir::rename(const QString &oldName, const QString &newName)

为什么我需要指定目录的旧名称?它不是当前的名称吗? 我在考虑这个重载函数:

bool QDir::rename(const QString &newName){
    return this->rename(this->dirName(), newName);
}

这个API是否是当前目录的子目录?

我没有使用过它。但是据我理解,重命名适用于该目录中的所有元素,而不是目录本身。从界面的角度来看,这也很有道理。就像 QFile 没有这样的重命名函数一样。 - Hayt
1
如果您想重命名目录本身,而不是其中的文件或目录,则使用QFile::rename - peppe
@peppe:根据下面的接受答案所写的内容,QFile::rename似乎不够。如果是这样的话,应该在QT API中添加一个“真正的”QDir::rename。 - ABCplus
2个回答

5
不,这并不是多余的。一个可以指定包含多个文件的目录。例如,考虑目录"mydir/",其中存在文件a.txtb.txt。因此,使用以下代码片段,我们可以根据它们的旧名称重命名它们。
QDir dir("mydir");
dir.rename("a.txt", "aa.txt");
dir.rename("b.txt", "bb.txt");

文档肯定需要改进:“将当前目录对象中包含的文件或目录从oldName重命名为newName,并返回...” - ABCplus

5

QFile::rename(const QString &oldDirPath, const QString &newDirPath)可以重命名一个目录本身,而不是目录中的文件或者文件夹。第一个参数为需要被重命名的目录的路径。

如果要重命名一个绝对路径下的目录,可以使用静态方法QFile::rename(const QString &oldName, const QString &newName)

如果要重命名目录本身,则需要使用以下代码:

bool renameDir(QDir & dir, const QString & newName) {
  auto src = QDir::cleanPath(dir.filePath("."));
  auto dst = QDir::cleanPath(
    dir.filePath(QStringLiteral("..%1%2").arg(QDir::separator()).arg(newName)));
  auto rc = QFile::rename(src, dst);
  if (rc) dir.setPath(dst);
  return rc;
}

1
我认为你的函数 renameDir 应该成为 QDir API 的一部分。 - ABCplus
@ABCplus 如果你真的这么想,你应该注册一个Qt账户,获取Qt的副本,并提交变更供审核 :) - Kuba hasn't forgotten Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接